tmp9balx013/0000700000175000017500000000000013622203605012707 5ustar carstencarstentmp9balx013/icons/0000755000175000017500000000000013616566001014041 5ustar carstencarstentmp9balx013/icons/ponyprog.ico0000644000175000017500000044747213616566001016434 0ustar carstencarsten 4V & 08 +J@K M2E (& ''vv{6tt|Dtt|Dtt|Dtt|Dtt|Dtt|Dvv{6mmmzz.ߴ퉀yy*ppqqzwzXΦ;Q'XyuuxFzwzZˤ!Vw2P Bd;$Spww{:ssźWKn9(F6.M􇀃UUUy|N_D?t#Qt5,(Ëvvv yyy&똈VB|>pJl9*'C̓Ġzx}buuy=𝋎Ʀ>r1\;0%?ï֪|~oyyyⓅ{:p3_}-9>Zxxx ._-K)H0ww{>xxx ᓅU!=1 =ww{:ww{Oš$TuJj:pΦww}\xxx3z\ww}-xx|@紵쏃㏃㲗岳zzzvvv̙䉁zwzG|y|J瘈~uuuwwwzzzzzzmm( L NNxxx$vv{luu{vvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzwwzktt|!qqq ww{vvzvvz}y}}y}}y}}y}}y}}y}}y}}y}}y}}y}}y}}y}}y}}y}ww{ww{vvzmmmUUUxx|yx|xx|wuzvvzEvv{fuuzvvzժϧvvzyv|zx|wwzuu{Svvzvvzxw{vvzvvyTvvz|y}|}vvzxx|Ǥvvzà龸I=oIj Aa"Ojzx|vv{xwzȥvvzàQ=s-_5b+Tv=[9)Hmzx|uuzwwzvvzà~0`A_.L5DfCb;4)J}yw{ͥxx|vv{luuz`vvz}y}vvzàdn A` Dg43!>Cd=/%FIhwvzvvzyw{xxxuuz^vvzvvzàxKD*[6`(E'D7Fj;0@'Zwţvvzxxx"UUUvvzàOELn Ff$A30'3azx|yw|ww{{~vvzàoAzC;e2Xw9>9 '.ˋzx|yx|uuy||y|vvzàò2]D}**.zx|yx{uu{Uvvzơvvzà{vw)X|@w=iAa + A27ʈxw{{y|wwzxw|vvzvvzàƀDBxg;d+Z{.$D1 6Vww{wwyvvzyyyqqx"vvzà:h0^Jk*UvMn4;'@pww{ppvvv4vvzàLm?v%A5Cd#B,6սwvzvvzvvzsUUUss{xw{vvzvvzà>sG&Ux(-L2)Gfww{wvzvvyauuy|{x|௰vvzà}Cx25 "5ݼzx|vvzwwzvvzà\FfC|#?,-J*Urzx|wuyuuzvvzà,Y{OoŻ(Zw$A">zx|ww{uuz~ww{à(YzǻAc{x|춶~vv{uu{Uvvzzx|xw|vvzvuyww{<ww{wwyvv{~ۭݮ}vv|uu{Uuu|%tty7vvzݮ~vvzww{yx{yx|ww{vvzᰱvvzww}-uuzqvvzʤ٬ϧxw{xw{vvzAUUUUUUtt|Dwv{yx|Ҩ٬ȣvv{huuyJxw|vvzvvzvvzyx|vvv yx|vvzvvzvvzxw|tt|Duuuuuz2xxx3yyyssxxx3xxx1zzz?(0p *u u wwwvv{huuzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvycttt uuzdvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvv{uu{Yvvyvvzvvzժⱱ㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲㲲ᰱժ~vvzvvzvvzuuzmvvzww{vvzvvzuuz^mmvvyNuu{Uuuzdvvzvvzvvzvvyvvzvvzvvzvv{lttz.vvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzEvvzvvz|y}vvzàvvz㲲vvzuuzmmmvvzvvz㲲|vvzఱ٬vvzѨvvzvvyss{vvzww{ww{vvz붶{NDv0\5e䲲vvz}z~ޯvvzvv{ttz,vvzzx|vvzvvz붷ڼurABu;kGhB^1O#@Kf㿰䲳vvz|y}߯vvzvvzvv|)vvzyx|vvzvvz붷MRM^?]<(F1YyJnB^A0>#EZ䲳vvz|y}vvzuuyvvzvvzŸⱱvvzvvz붷pk)YzDcB`*G:/.MImB] A*7(H6U䲳vvzwvz{vvzvvzwuu{vvzvvzvvzvvzvvz붷Wep=]Df Cd+I%44GkBa >20@/NW䲳vvzvvzvvzvvzvvzttt ttt vvzvvzvvzvvzvvz붷HHBxMo&Nr%PsLo .N-=` Fg??->-Mf­䲳vvzvvzuu{UvvzEmmmvvzvvz붷P=>C?tKE6sAb9Y8*G@a0?)<1Ql䲳vvzvvzvvzvvz붷C:K@/.N.:*1 ;YG䲳vvzvvzxxx3xxx3 xxx$vvzwwzvvzvvz붷B}:GE=olMn8UA<1 ',+0;Y.䲳vvz|y}wvzvvzss{vvzvvzvvzvvz붷>r=tAzh6`BwAuB~:[{?\"C643 #(0>];䲳vvz|y}vvzvvzAuuyvvzȣvvzvvz붷,*@wB?u?oq9a-X{0L57>2)#1e~#䲳vvz|y}|vvzuuy=vvyvvzvvzvvz붷^MBcD>o=i)Tv.N"04>;-![䲳vvz{y}춶ܮww{vvzyyywwzkvvzvvzvvz붷5L|.bH?sBx;`} Gi$ +@"@-/䲳vvzvvzvvzvvzvvzvvzwwwwwzvvzvvzvvzvvz붷ŨuP=rM=klq䲳vvzvvzvvzvvz붷&WxPrAtDd)0PDd>\!A4 %'D䲳vvzvvzvvzvvzxxx3vvzvvzvvzvvzvvz붷;mEgK:j0& .M8i䲳vvz|y}vvzvvzwwwvvzvvz紵vvzvvz붷=i ?`Y¡Np ;.N8䲳vvz|y}vvzvvzuuuvvzvvzఱvvzvvz붷$TsGgZ~%?翹䲳vvz|y}糴vvzvvzvvzvvzƢzx|vvz糴[*_~ఱvvz|y|vvzwwzww{vvz}z~yx{vvz֪Φvvzvvzvvzvvzvvzuu{Wmmwwzvvzvvzvvzvvzⱱ㲲vvzvvzwwzvvyuu{Yuuy;tt|Dww{|vvzzx|굶xw{vvzvvzvvzvvzxw{㱲xw{vvzww{>vvzvvzzx|vvzvvzvvzvvzvvyvvzvvzvvzvvzvvz|y}š춷vvzvvzss{vvyvvz}ʤvvzvvzvvzuuzdxxx$mmmvv|'vv{jvvzvvzvvzšƢ|vvzvvzuuussy*vvzvvzvvz|y}zx|vvzvvz{UUUvvzvvz|y}zx|vvzzz|xxx" vvzvvyvvzvvzvvzvvzvvzvvzfffvvzvvzvvzvvzvvzvvzvvzwwyvqqq vv{4wwzVvv{fvv{fwwyettt ppvv{fvv{fvv{fvvyTxxx1?????(@ K mmmss{xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3xxx3vvvxxx3vvyvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzww}+wwwwwzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzwwzttuuy=vvyvvzvvzvvzww{vvzvvzvvzvvzvvzxxx1vv{8vvzvvzvvz~z~{y}vvzvvzwwzww}+uuuvvzvvzvvz춶vvzvvzvvzmmvvzvvzvvzvvzvvzvv{vv{vv{vv{wwzxxx3vvzvvzvvzvvzvvzvvzvvzzx|춷䲳ww{vvzvvzvvzvvzvvzvvzvvzttvvz}vvzvvzvvzvvzvvyvvzvvzvvzvvzvvzvvzvvzvvzvvzuuz vvzvvzxw{|y}vvzvvzᰱ׫vvzvvzxw{vvzvvzwwzIvvzvvzvvzyx|vvzvvzvvzvvzttww{rvvzvvzšyx|vvz̾ɽº}z~vvz|vvzvvzttz,vvzvvzvvzѨvvzvvz[E~>t]'!>,65W EkB_!B; '4@*J7VȄ|vvzvvzvvzvvzvvzvvzwwwuuxHvvzvvzvvzvvzvvzvvzBFm^:\Jj#Jn Ee7_ &$@*0OJoBa >?40@'H8XD|vvzvvzvvzvvzvvzxx|@uuxHwwzwwzvvyvvzvvzcKBI.c"Rt;j7X{:fD'9*I0"?'PsDd;@9*:!BDdȒ|vvzvvzvvzvvz⾼I:HABt:lHƝ|vvzvvzvvzvvzvvzvvzvvyxxxvv{vvzvvzvvzvvzvvzF>t>v<?]@>* $ #1+-#>HɎ|vvzvvzvvzvvzvvzvvzvvzxxx"vvzyvvzvvz~vvzvvzL@t:p>s?sB{>tsFr;m;_}1]1P->8@< ' ' '$@ɕ|vvz~z~굶vvzvvzvv{vvzvvzvvzvvz´1W{"C5+Aa ɔ|vvz~z~vvzvvzvv{nvvzvvzvvzŸⲲvvzvvzO7cAcHD=s@w:`}6\y5T # #-@A8/*)Zzg|vvzvvzvvzvvzvvzvvzvvzxxx$uu{SvvzvvzvvzvvzvvzvvzĬ6sNZ^-Ps'Wzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvv{vv{vvzvvzvvzvvzvvzvvzvvzvvzvvzvvzww}-vvzyvvzvvzvvz굶vvzvvzvvzwwzvv{lvv|'ttz,ww{rvv{vvzvvzvvz岳vvzvvzvvzwwyevvyvvzvvzvvzxw{ʤЧЧvvzvvzvv{uuxHuu{UvvzvvzvvzЧЧɣww{vvzvvz{uuzbvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzww}-xx|BvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvzvvyRyyyvvzvvzvvzvvzvvzvvzvvzvvzvvzuu{vvzvvzvvzvvzvvzvvzvvzvvzvvzww{mmxxx5vvy]vvzuvvzvvzvvzwwygvv{pvvzvvzvvzvvzswwz\uuz0??(h P%%}y|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|zy|z}~]efbpmd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zd[Zjsmd[Zy|zt|}qtrڮ⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨⬨کک}ݸ8:t|}ݸbpm\wrMhbA`\\vw崵{xt8:A`\A`\\vw崵RTSA`\A`\\vw崵RTSA`\A`\\vw崵RTSA`\A`\\vw崵RTSA`\A`\\vw崵RTSA`\A`\\vw崵RTSA`\A`\\vw堤望望崵RTSA`\A`\\vw.+ !&*ss望KL$'$'DDQRKL.+KLᘖ崵RTSA`\A`\\vw堤 ! !$'.+QR$' !YZ6: !ӄ崵RTSA`\A`\\vwYZQR6:cdᘖ ! !YZ !6:崵RTS}}}GOOA`\\vw堤$'ԋQR !ᘖԋ.+ !6:崵{xt8:t|}}}ȥ}RTS~}A`\A`\\vw??.+ln6:ӄ?? ! ! !yy崵{xt8:o~{}TniMhb]efqtr}}ݸ幾幾幾幾幾幾A`\A`\\vwyylnssyyssssssےےYZKLYZyyYZKLyy望KLYZ~~?? !cdssssssyysssssslnKLcdےYZKLYZyy望.+.+ ! ! !6:ӄ崵{xt8:f幾幾幾幾幾崵}t|}Mhbf}]efqtr~}幾A`\A`\\vwےln$' ! ! !cd望~~ ! !YZےQR$'~~.+ ! !YZ ! ! !.+望&* ! !望ӄYZ ! ! !&*yyKL ! !ᘖ~~ ! !YZےQR$'~~cd ! !&*cdے崵{xt8:p}~t|}MhbfA`\Mhbt|}~}幾A`\A`\\vwcd ! !&*&* ! !DD !ssQR ! !ےcd ! !ln~~.+ ! !.+???? ! !QRln ! !ss&* ! !DD !sscd !??崵{xt8:p}}~~qtrjbaکJMKjsmMhby|z}幾A`\A`\\vwᘖ ! ! !ᘖ ! !6:ԋ ! !望ss ! !lnӄ ! !cd望 ! !ԋ$'yyln ! !??ے ! !KLᘖ ! !6:ԋ ! !望$'cd望崵{xt8:p̚}~~t|}Tnio~{JMKjsmMhby|z}幾A`\A`\\vw ! ! !望ԋ ! !?? ! !QRᘖ ! !DD ! !??~~ ! !ln&*ے ! !$' ! !&*ԋ ! !?? ! !QR~~$'$'DD&*KL崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw6: ! !yyᘖ ! !??$' !$' ! !$'.+ ! !cd ! !6:QR ! ! !堤6: ! !望ᘖ ! !??$' !$'6: !ssԋ !6:崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwYZ ! !cd.+ !.+.+ ! !堤?? ! !ssQR ! !ے?? !.+ӄ !ے.+ ! !ӄYZ ! !cd.+ !.+.+ ! !堤ԋ ! !ԋ ! !yy崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwyy ! !??ᘖKLQRcd~~ln ! !.+ ! !望YZ ! ! !ےss ! !ln ! !KL$'??QR ! !cdyyKLQRcdԋss ! ! !堤ln ! !.+ ! !望yy ! !ԋ ! !cd崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwᘖ ! ! !堤ےӄDD !&*~~?? !~~ ! ! !ln ! !KL.+堤ԋ ! !KL堤yy ! !ln6: !望ln ! !DD望ےyy.+ !6:ᘖԋ ! !??DD望DDے?? !~~ ! ! !ے ! !ԋ ! !cd崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw ! ! !望?? ! !ӄ??.+ے ! !QRcd ! !KL望6:lnQR ! !????$' ! ! !ے堤 ! !yyے ! !&*&* !$'堤~~ ! !6:yy.+$' !DD??.+ے ! !QRDD !lnԋ ! !~~ss崵{xt8:pȥ}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw6: ! !~~ԋ ! !&*ln.+??$' !QR.+ ! ! !DDDD ! ! !yyӄ?? !.+~~ ! !ԋ ! ! !cd ! !DDKL ! ! !$'ln ! !YZln.+??$' !QRYZ$'DD.+$'cd??.+ !ᘖ崵{xt8:p}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwQR ! !cd ! ! !yy堤望堤ے堤.+ ! !ӄے ! ! !堤堤堤ے堤望望堤ےԋ崵{xt8:pв}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwss ! !??.+ ! !QRKL ! !cd ! ! !~~崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwے ! !$'6: ! !QRcd ! !KL ! ! !yy崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwے ! ! !ے堤 ! ! !yyln ! !$'~~ ! ! !望崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwcd.+ ! ! !.+lncd.+ ! !QRQR$' ! ! !??lnYZ ! !$'yy崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw堤ےےԋӄ~~yyssssӄᘖےےԋӄ~~yyssyyԋ崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵{xt8:p}}~~t|}TnifJMKjsmMhby|z}幾A`\A`\\vw崵{xt8:p}}~~t|}Tnit|}TniMhbt|}~}幾A`\A`\\vw崵{xt8:p̚}~~qtrjbaڮв]efbpm~}幾A`\A`\\vw崵{xt8:p}}~y|zMhb}Mhbbpm}幾A`\A`\\vw崵{xt8:p}~]efy|zTnio~{}ȥȥȥȥȥȥȥ:V^A`\\vw崵{xt8:fȥȥȥȥȥȥ}po~{jba\wr\wr\wr\wr\wr\wr\wr\wr\wr\wrGOOA`\\vw崵{xt8:Mhb\wr\wr\wr\wr\wr\wr\wr\wr\wr\wrA`\A`\\vw崵RTSA`\A`\\vwݸв崵RTSA`\A`\\vwȥfC:g?`@aBmBmRr(S_Rr0Wu?akȥ崵RTSA`\A`\\vwвȥ̚xY@~?{?{=p>=b7j>>>=b=}=bC>=}=b=b=b=}:e7j?`?{?`@a@aBeBxBeBeA_A_A_.M%H A A@%%".A`\ȥ崵RTSA`\A`\\vw⬨c:C?q{wwY>=}:e9o@a=p9:>{{w{uJA=}8>=}:e?`@a?`?`@a@a@a0WuF{F{BxA_A_A_A_.M A A A A#@ A!=.@@pqݸ崵RTSA`\A`\\vwo~{8AA>>Cw{wquJ<>A=}=}:e@a@a=b=b?`@a@a@a@a@aBeA_A_A_A_A_ A A A A) 0 A A A;B{xt幾崵RTSA`\A`\\vw崵y>?>A>P?C{{}w{}'Dw*ZBeF{A_ EcBx0Wu@a)FA_ Ec0Wu A!!); Ec Ec)!!# A%HBeF{A_RtBeBxBeA_ A A A A A!)!!1 A A A A A"\"\%H;B Ec崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw̚B9Cd}{ww{{S[@)FBe>VV^y*Z8Z>8P|A_ Ec0Wu'DwBeA_P|?`?v8Pw!   6@Dd8Z A)!%H Ec0Wu'b~P|'b~F{Be*Z.M;6 A A A;+%! A A A A A*Z)F;B;B@pqǁ崵{xt8:p}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵A?>>??ACuy;Rr8=}?<_Be0Wu Ec<_<_@a7jA:g+   %8Pw8Z)F 0!  A Ec0Wuc:g?A?`7H@a@a@a=pAuJPj'Dw (Rr=p.M%H A A!%!= EcP|@aF{BxBeA_"\14!= A A!=4(!!2".#!= A A%H8Z(S_#崵{xt8:p⬨}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwJ<:A<>???CjPU8Z@~}j^_?`?`=p=p???9PCuRr?{jwAu7H.M.M.M A;%4;R@a@aP|F{BeA_ A1 0; A A!=1%!#!2!= A*Z*Z A)FCš崵{xt8:p}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwqJA?CCA>Cd?`@ad}wwAA>=}9o8Pw'DwA_<_%H A A@;%".A_'b~Rr"\ A1!); A A A A A!(6;)!2 3A;Bzcš崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw~AAAAAA>@~@~>=b9o?v:g@Dd@DdA_<_%H A A@;%.M8Pw8Z*Z A#!%' A A A6 A(!);(-;>|_Sš崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwfA>>>?`?`:g<8=}>=}8Pw@a@a@a7H@Dd8Z)F A A A; 0!!';B8Z%H A A4 01 A@!!!!!% 0;!8:Wš崵{xt8:p}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw?v>>>?AA<>A=}:e=b?`=b?v9o7j=}A=}<=}7j7H?`?`@a@a1S}8Z)F A A A A;%!%!=.M%H A1!2; 0 A6%##!%1 A!-is!š崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw9o>>>?<:8?CAu:eP|?`?`:e=}>>A<:=}9o@a=b8:ABAAA8?9o@~@~@~>=b@a@a@a@a@a8PwA_.M%H A A A;%(!% 0 0 0 A A A A((!%;!#%'!=!=-is!ǁ崵{xt8:p}~~qtr]ef]eft|}~}幾A`\A`\\vw崵[<>8>8A=b>>8>?`@a@a@a@a@a7HA_8Z/D A A A;%(%!!!! 0+4!=((%% 0!#%'!= A+is!l崵{xt8:p}~~jsmy|zв{xtqtr~}幾A`\A`\\vw崵f@~@~8AAAAA<=}=}=b>8C88<CC>@a@a;Kh1S}9o:e7j=b=b7j7j7jAAu>>>:CY?{@~U>@~@~>>?{?`@a8Pw@a'DwBeA_BxBx<_%H A A A; A A#'%!!!!! 04 A;) 0!=!(%4 A->|_!l崵GOOA`\A`\\vw崵[9o=}9o9o=b=b=b=b7j=}7j=b?{>>:8>>>>>>9o@a'b~@a8Pw Ec.MBeF{8Z/D A A A A A A!2'+ 0%!!!! A A 0(- A+'(; A->|_l崵RTSA`\A`\\vw崵f>>>=}7j=b7j:e=}=}@~9o>>>>?>>>@~>>>>@~8:>7j=}7j=p?`7j>88><89o1S}@a9o>>>9o>>>>@~>>>>7j=b@a?`CCCdd??v?`7H=b>>>>>>>>8?{'b~'b~=b:e=p>>>:g:g>8C8=p0Wub:g8PwA_<_*Z"\ A A%H8Z8Z;'#!= A A A 0%!! '+4!#!(' A".]Wzcš崵RTSA`\A`\\vw?`7j:g=p=b?v?`@~cCCUo~{=p7HP|9o><<=}?{6q9o8C8>:gb:gHk'DwA_8Z"\ A A)F;RA_ 0%+4 A A A@ 0%!%% 0!%%'!2 A".]Wzcš崵RTSA`\A`\\vw@a=b:g=p9o?vCӱzcisCddux=p7HF{=}><:8>?v=b@~C>>:g'b~CC8>=b@a@a@a@aA_A_A_.M.M!='4.M%H 0%'!= A.M A A A!2#%%##!(;4#-]WdoK崵RTSA`\A`\\vwZZbc=p']=b>888>=b>>>=p@a8Pw@a(S_A_KfA_A_!='+; A A#(; A/D!= A 0-!%%##!%1(#']Wdoš崵RTSA`\A`\\vwisBm?v>CY>>?v?`A>CC>>=pBm=pBmBm@a@a@a@a@aRr0Wu EcA_<_L 01/D A A1 A A A A!=4!2!!% 0(!%#%! 0]Wdo崵RTSA`\A`\\vwlx=b>?{?{?{=pAC@a?{?{C=}>C0sx>?{A>ACBm>?{>>A>=p>=pP|(S_A?{'] EcA_%H 0+4#!= A A(( A A A A A-(#' 0#!!(%H\wrb#š崵{xt8:p堤}~~t|}TnifJMKjsmMhby|z}幾A`\A`\\vwšFGOO;Kh@a>CddAu>?v>AA>?{']Be'b~>?{']8ZA_Rr;R;B".(( A A4(!2 A A A A A1(- A#!  0/D\wrbl崵{xt8:p}~~t|}Tnio~{JMKjsmMhby|z}幾A`\A`\\vwljsm.@0Wu?`>CdU?`:g?v?{BmBmCC@a;Kh@a>?`;Kh A;BRr?`'b~0Wu 3A# 0 A A!=( A A A A'#%# A#   ASWW!Kš崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw*9U)F0Wu?v>8C>>?{@a>>?`?`:::g@a@a?`RrRr@aRr A;)!    +!24+ A A4 A A A/D!2".!= A#!%1 A[K崵{xt8:p堤}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwKǁ*9U".Be9oCCCC8>>uy=p0sxBm@a@a@aSKš崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwKBCu>7j=b?`=pCUA=p?`:e:Cq}>>?{0sxb:g?{quuuyS[.M A1(!;%H8Z)F)F A A!=!2!= A!!=KfW崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwšlu<>J@~=b@a@aYq}{d>7H?`@a@aUuY@Dd@a>Y=p9oc_uxQg8Pw@aA?{>=pQg@a;KhHk2Q-### A/D A!=/D A A1+!()F@X6q崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw:g?v7j?{=p`=}@a@Dd@Dd@Dd8Z4%%% A)F A A)F A'%!!!;;B Ec6q崵{xt8:p}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwвQg6q8Pw=b@aA_ Ec>u{,&A:V^@a@DdA_:g>8uUc>Rr Ec0WuHkRr 3A(.@0Wu9o@aRrBeF{@a@aRr Ec;B A A A;(4 A A A A!#%%#!;Rb[幾崵{xt8:p}}~y|z]ef\wrGOO}幾A`\A`\\vwڮQgHkA_kr?>'b~>?{:g'b~ EcA_)!+8Z7H Ec@a0WuBeBm?{A>?{:gA_!'%% A"\"\0Wu EcA_A_A_A_A_A_Rt8Z)F A!= A A!='!!#;B!=9ӱ崵{xt8:A`\TniTniTniTniTniTniTniTnio~{}:V^A`\\vw=pSWA_A_Y?{Bm?{8>?{>@~?{Cd?{C?J?{?ak;R'% %# 1A_:g?{']Bx?A_ A A A!!'##!%!=".8ZE崵RTSA`\A`\\vwnU>>A_SW9:>A>8>>>SW 3A'!'%%8Z>=}?`0WuBe"\ A A 0 %;)!!%;BKf?崵RTSA`\A`\\vwdU>RrKf8dC9C8>>:gHk8Z)F;!#()F:g=}?vU8qP@~9o>=p0Wu Ec%H A!4( +Rr:g9o9C{{>?v<>@aHk%H!2#%  !.M@a=b@aA_-+-#!#%%(4!2Kf[ݸ崵RTSA`\A`\\vwu{uUd>{xC<><@a(S_2Q;B;  !%H Ecu@a0Wu)FA_'! !)F;B;B@XA_!!!   '4'!SW幾崵RTSA`\A`\\vwqrxxq{{j%H#;% ! A A;)<_%HA_8Z 0 ".KfU崵RTS}}~y|z]efMhbMhbjsm~}幾A`\A`\\vw$' !$'ےyy ! !YZln !.+ᘖвP?{0Wu2Q;Khc__>Au%H!2;% !!2;44A_8Z.M8Z A 3AC崵RTS}}}~~qtrt|}GOOTniTni~}幾A`\A`\\vw ! !$'$'ᘖ堤6:QRln !&*堤7j?{0Wu)F.@0WuU=pAu<7j<_/D;%!(-(;A_A_%H8Z%H!@a幾崵RTS}в}~~t|}bpmJMKjsmMhby|z}幾A`\A`\\vwᘖ ! !cdcd.+ ! !DDu=b?{0Wu)F!=Rtc>?{Rr:g?{@~:e;Kh;B#%!!!%);BxBx8ZA_8Z#C崵RTS}}}~~t|}TnifJMKjsmMhby|z}幾A`\A`\\vwӄ ! !ssDD??&* ! !崵U=b=p;Kh!=;B{uU{C=}AC:gA`\A_;#%!!!);<_BeBxBeA_!=崵RTS}}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwln ! !~~ !ss ! ! !望崵?{>>6q Ec)Fc}{Aqqq{Au8Pw)F; 0!!%%;A_*Z.M8Z.M".c崵RTS}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw堤DD ! !ᘖԋ !lnyyQR6: ! ! !yy崵Qg=b@a;Kh)F/DYвݸ|rrrqC=p.M%H;!###;;R8Z%H)F%H(c崵RTS}}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwᘖ.+~~$' ! !ے !6:yyDD !.+ے崵xRr=p=b*9U".(S_nrrrqw:g0Wu8Z".!".;B;R)FA_8Z)F!2!c崵RTS}ȥ}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwے.+ ! !.+QR ! !ԋ$'??ڮQg Ec0Wu@a A2Qf幾{?c幾崵0Wu2Q;B{崵RTS}}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw望堤崵'DwBe崵0Wu.MRt崵崵RTS}̚}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw堤edQg幾崵:e*Z7j崵RTS}}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vwڮȥx崵RTS}}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵RTS}}~~t|}TnipJMKjsmMhby|z}幾A`\A`\\vw崵RTS}}}~~t|}TnipGOOjsmMhbt|}}幾A`\A`\\vw崵RTS}}}~~t|}Tnit|}bpmTnibpm~}幾A`\A`\\vw崵RTS}}~~t|}Tni}]efqtr~}幾A`\A`\\vw崵RTS}}}~~qtrjsm\vwMhb~}幾A`\A`\\vw崵RTS}}}~y|zRTS}\wrGOO}幾A`\A`\\vw崵RTS}幾}A`\\wr\wro~{\wr\wr\wr\wr\wr\wrGOOA`\\vw幾崵⬨堤{xtt|}t|}t|}t|}t|}t|}̚⬨崵幾崵JMKt|}}}}}}}}~~bpmf:V^A`\\vw崵y|zqtrTniTniTniTniTniTniTniTnijsmjsmjsm~ڮ崵GOO}вȥA`\A`\\vw\vw\vw~t|}jsmjsmjsmjsmjsmjsmjsmjsmjsmjsmjsmjsmMhb\vw崵{xt8:A`\A`\\vwbpmt|}t|}t|}~~~~~~~~~~~~~~t|}t|}t|}Tni崵GOOA`\A`\\vwA`\Mhbt|}~~~~~~~~~~~~~~~~~~~~~~Mhbے崵RTSA`\A`\\vw̚Mhb~~~~~~~~~~~~~~~~~~~~~~~~~t|}MhbTni̚崵RTSA`\A`\\vw堤bpmjsm~~~~~~~~~~~~~~~~~~~~~~~~~~o~{Tnibpmے崵RTSA`\A`\\vwbpmbpm~~~~~~~~~~~~~~~~~~~~~~~~~~~~o~{Mhbqtr崵RTSA`\A`\\vwMhbjsm~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t|}A`\崵{xt8:ڮ8:t|}A`\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bpmڮbpm\wr~qtrڮکککککککککککککککککککککککککککککککککککڮݸA`\qtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrMhbڮکککککککککککککککککککککککککککککککککککک~jsmjbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbaqtrjba]efGOORTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTSRTS]efjbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbajbaqtrjbat|}qtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrqtrt|}}????tmp9balx013/icons/ponyprog.svg0000644000175000017500000036044313616566001016451 0ustar carstencarsten image/svg+xml tmp9balx013/icons/ponyprog.png0000644000175000017500000002062213616566001016426 0ustar carstencarstenPNG  IHDR~`PLTE !%)0 (+#6#1'@-4;."2!=!A L! H%'$\"A&,F)*&@.D/Z*M.A3 +.Q2:8B;d/ Z8R;:6U9*_<X@_AeB??cE ?xBdD@DDfKKMJkHwD'{FWSOOGhK;LK_S(H7tRSTRrR|P^V:W]wP8RQ}S1Kc.uW0Z[d\`AZYka?]'abjcb`~b'fe]bhMa@rk[Sc<`?dcg:deinTb=gQqp@mBe:mpbxs0msj_|>j7nlq6rtqp=rw\wv\o9tx{ssv?z|y}|tYp{~ouA{?yyƗA~}=>C~@~~̉f}xYA[:8<ӷ_9siJFpqUyԞnW}۞E×CCߒBÜ>dY?֘Pu梣cz֙^әjߜ9ßuUic妥AVڬodw㪆Хޮ!ٷ>lව}Ƚ{K#bqת{ĿZűӁSɹ{|xr(JtRNS@fbKGDH pHYs%%t;/tIME8"~ IDATx XSW%!!BfCo(4:jČ@]TjsAKM!֖i4Ttj[A]ERFPimǙθ߹7@bB>|J˛{|ȷgG^Kna-+CV=dev7Y>-vOz<.|߽NelumH[q;:UK?d'6dflmڪ~ުeÓCֆ ey2m֮Ći&KP7Гؐ{lC6}ɺX:?wޱĠnl-eGazy#͋־H˶&rӆriٰӖ{ [M`/N/U@\=nWiZ_CBv}WyQOǁ%&: _2e>Dd]Yr "-!u,yE<=HwE]J|ȀwWh:kmiKFLZ6QSbvK`N.Jcq*hns{TrbZdgT­GRHkK_xQ!K~κ}[@̪8:O*# S32kIsﷹd2ϯ /qOtG JGfK7mkkk_( gOB uv_Cz1Q_f2'Kv8 ūՄ$0 lTti\ t6/~}eً(h-HV`QbP |yʧ˖ myYynzt4Ngc2@sdG7+"JݗggyyV TDJ#i?'.h< ~vWvnl_gPUdb;BBP؂cg %N$0޽qF4nҚf{o^hO^I E!2B \v3:< *i?<&ID&RTnP:A#uoNg7{duښ oWƅp6?Q% $ƣMVIw__%__j_n__j4k'+l18 d_wKPu:vmkoL'7G+ bq֛~ YW@cm{"urB0Rn B6m&yPM]Q gUXAAL'Alp|[ė#LݥKmv*ASdb$Cy œ_;?dg]ΒTYI۞B eid8&j=!pƓ<Ȓu.K+?rPqJ.$F[ <ӆ2"m-:ZdԴX *fЩp@|WNndG=+o*kKzqvF '8| %s/'*[KJjZ^z|~Rڢ{ z`gO!R+UC`YR֓dr .S%\bϽo<9m]'O`_f. }ySSUR(F7E}Lg!$j$ gظůMƬ,ف6,DgsfZi槖OE/4k ٬#q2\(di2+8 K>j̛3Hf\7` Y7OP$|q(! r@EFW(Kܧ=\OR+S |k(KN$T >O R?YolmdƜ,Y^Rvӡ(ȉ'l0U9)5+Kho+eFŠ7Sï)z+e^N&Oh\aPʟut],^gZ;'٬OI qŪ#Cq܁b@0~?6O$7[7h."Kh2>Roh Dۺ/jj^;WI\#0 cN:dn|nqRʶo(bm)0.&@hǂ%1dzzz~A2Oe 6K*d8 gttj; 㪶yqow}:X $ٻЯ/{-%V,A`X'ƂW׮ +YPٍsou~v]zm+8uѸb\"VF vqγuGdg?hr:(Jo<첒VLRSBaǠaID? LsW5"`=7.4BmqVVB٤78J$-:Ul(pTz4g+~0&RƵ?tv0y .cX ( Z-E!m*BDGyP8BC^CgW*nnFg0V+IB -" .T\hJh`W_\Iv,ѼK󟏩t,GL6j,2D`8r dѸ(lȮu ?SOIY!~gN3Eᡣdc`*%B6 Mn #8E1j21ǚ^P@&!Wj XEr:A`@6헟@N:"t@^GPSօj(V8e\:݆8,ʼn~wx@]_87yD255Sf' EQ,8yFg= [ۋPqod@ݸܫ&GMM1x3=+@?͔}d r ~Au%: 2t:"4' Lt b1p>@./Lϡ*,ǰ*(Г)$Ih B%䈔xGŦD WBd,nٽaBURRBR$&D a 6kb+-9@SHav{<ݑKF(,K2(U$\.|$cV|ک- +4V /kvgRXXHhơ$eR^h2Ix?_k(޼~99j!:e1;mҤGd* 2m 8]e׋JJߕ9N?D Knsزf`@R1"cK@{abYy az:gd%fl-M4څ)P" 9a-pD/nDOi2%'V`OȌ&xq,rB2 Z֧{5t6g*pBn22J-Yw Xr@٣"6KA<xظ>vrAZþߒe߷㏋ffIKAj0b*;(Q8VB ,9WʜY9e.ñ,QvM[,!7r)m2GRSV٫[eF2pN8G E j.}sK^~Z_h:XWxeS4ԺY ڪ$Gs]t06K\^ ˠɎ:3вXJݏΚ& QXHBT,X1.͙0;QP!D(2vta}R;ۣr8MȂf . , 6%`ѝwѶ_:~ij:$H9)Wh&2x6ztãdJͶ>WwZk)E+d\M'd Urh,&1 袓&S=~Zqycمc%Bl,^JFs(Ts&L@Páɢ(k[}5{N83'N}|iSu i-*dDD62 X4Y ju2ݽ{d݄}d& 5jNbF`l\ )gdQ@;Jf6u+g$T‡hӧڜa6zB&MJ*"ԛU{tfze3w\?Cٻgz~Q9vֹ:]GsLKѩg!Ce*NG-"S=)riZ|sc>$O| ijs;:F'lTxO'N@dQ'WeOgjtOIS&%͙d$ l jZAGseBd+gFdA*Gӥv셶SD7K\HhEy׃C;smѣUUΦvRe2H cZ/j?T(_{>FYGU]v[ e0@꒒{C{<OU .O.v֢jB^$6i0(!W;w? ;gW=tWȲ VЙ%@LQ6;b+Gznh jm]^TDR_Oj0ⲟ IF unG`eQx9LQCS#_\h)S^#F%ia9ȱ7رh ӵ3_yGua!U>imme /![Fhdo}h顴̢c?<^;0/yYY0tNZ"[1'̬zCsRӟklzhP5TTl߲1o͚-;=Wmo6qR4.}wur^$\VѬQA$_iFU,)k>cOY*ÏyM} tlpc~Fkߧodq~A>Thr764z(!ijwG'?|R;;.!R:I]z$HNB: Of뻚DN\'yw w qH0n4ϞnjvBdѺ8F *yqu}$i6}25tvį3v2I:f#͇dJ׀nz:&^&ȋ;aRIW 62S?dvΘtc3 I> )i Dkݑ əWmw{9h^׺3Ǻ|Hn]@{]@"s{\fy&gF׏]:5@2ܹ;s=?6˓cNzs]##'q2P 7bƇ ^yomϡ X,x!s_7ƹ=K8x{aK Nتg>F^jipx-~! 1oA;vzV{ eWQ~n&%xS^__`Ƃ<.A 6fG L+U}\~o"Q ?X]910o?_ # q~nhwzmEU^^@ ǜz!~zA ll .".ȸAo'# l+9N:f`.;q3vwg0qF?A2h _yߝߝGrW}{O>[SaY/CRHK=(-~JIENDB`tmp9balx013/icons/icon1.ico0000644000175000017500000000137613616566001015555 0ustar carstencarsten ( @ppp]Pppppfw`wp11ppwpoxwppgppppgpp~gppxpU???? 9??tmp9balx013/icons/gen-ico.sh0000755000175000017500000000037513616566001015726 0ustar carstencarsten#!/bin/bash SIZES="16 32 48 64" for x in ${SIZES} do inkscape --export-png logo${x}.png -w ${x} ponyprog.svg echo ${x} done for x in 16 32 48 64 do CMD="${CMD} logo${x}.png" done CMDX="${CMD} ponyprog.png" convert ${CMDX} ponyprog.ico rm ${CMD} tmp9balx013/astyle.sh0000755000175000017500000000217013616566001014566 0ustar carstencarsten#!/bin/bash CMD=`type -p astyle` if [ ! -x "$CMD" ]; then # not found exit echo "please install astyle and restart this script" exit 1 fi ASTYLE2_VERSION="Artistic Style Version 2." ASTYLE3_VERSION="Artistic Style Version 3." ARTISTIC_STYLE_OPTIONS="\ --mode=c \ --style=allman \ --indent=force-tab=4 \ --indent-modifiers \ --indent-preproc-define \ --pad-oper \ --unpad-paren \ --pad-header \ --align-pointer=name \ --align-reference=name \ --formatted \ --lineend=linux" if [[ "`$CMD --version 2>&1`" == ${ASTYLE3_VERSION}* ]]; then ARTISTIC_STYLE_OPTIONS="$ARTISTIC_STYLE_OPTIONS --pad-comma --add-braces" elif [[ "`$CMD --version 2>&1`" == ${ASTYLE2_VERSION}* ]]; then ARTISTIC_STYLE_OPTIONS="$ARTISTIC_STYLE_OPTIONS --add-brackets" else echo "Requested version 2 or 3" exit 2 fi set -e $CMD $ARTISTIC_STYLE_OPTIONS --suffix=none --recursive "SrcPony/*.cpp" "SrcPony/*.h" #for i in $(find . -type f \( -name "*.cpp" -or -name "*.c" -or -name "*.h" \)); #do # $CMD $ARTISTIC_STYLE_OPTIONS "$i"; #done #for i in $(find . -type f \( -name "*.orig" -or -name "*~" -or -name "moc_*" \)); #do # rm -if "$i"; #done tmp9balx013/.gitmodules0000644000175000017500000000013113616566001015076 0ustar carstencarsten[submodule "qhexedit2"] path = qhexedit2 url = https://github.com/lancos/qhexedit2.git tmp9balx013/README.md0000644000175000017500000000230113616566001014201 0ustar carstencarsten# 3.1.1 - PonyProg - Serial Device Programmer PonyProg is a serial device programmer software with a user friendly GUI framework available for Windows and Linux. It's purpose is reading and writing every serial device. With PonyProg and SI-Prog you can program Wafercard for SAT, eeprom within GSM, TV or CAR-RADIO. Furthermore it can be used as a low cost starter kit for PIC and AVR. Ponyprog supports AVR, SPI eeprom, AVR micro, 12C bus 8bit eeprom, PIC 16 micro, PIC 12 micro, AT89S micro and SDE2506 eeprom family chips. You can open any HEX, e2p, mot, csm, rom, eep, bin files and burn them to uC or PIC. You can even backup the old program on the chip using Ponyprog. Ponyprog enables the user to write, verify and erase data on the microchip. Also setting fuse bits and locks using Ponyprog is possible. You can save any HEX file to BIN file or eep file, BIN file to HEX file or MOT file and vice versa so you can use Ponyprog as converter too. Ponyprog offers serial or parallel port programming for uC's. You can even change polarity of control lines without touching the wires using I/O port setup. You can find it at [www.LancOS.com](http://www.LancOS.com) ![Screenshot](Screenshot.png "Screenshot") tmp9balx013/qhexedit2/0000755000175000017500000000000013616566001014623 5ustar carstencarstentmp9balx013/desktop/0000755000175000017500000000000013616566001014377 5ustar carstencarstentmp9balx013/desktop/ponyprog.desktop0000644000175000017500000000032513616566001017647 0ustar carstencarsten[Desktop Entry] Version=1.1 Name=Ponyprog Comment=EEPROM and microcontroller flasher TryExec=ponyprog Exec=ponyprog Terminal=false Icon=ponyprog Type=Application Categories=Utility;Qt; Keywords=Electronics,Eeprom tmp9balx013/doxygen/0000755000175000017500000000000013616566001014403 5ustar carstencarstentmp9balx013/doxygen/ponydoxy0000644000175000017500000015631313616566001016230 0ustar carstencarsten# Doxyfile 1.5.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = PonyProg # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 2.08 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../SrcPony # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.cpp \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is enabled by default, which results in a transparent # background. Warning: Depending on the platform used, enabling this option # may lead to badly anti-aliased labels on the edges of a graph (i.e. they # become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO tmp9balx013/CMakeLists.txt0000644000175000017500000003035313616566001015472 0ustar carstencarstenPROJECT(ponyprog) # Configure CMake ... CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) # CMAKE_POLICY(SET CMP0003 OLD) # CMAKE_POLICY(SET CMP0015 OLD) # set the Qt version to 4 or 5 OPTION (USE_QT5 "Using of Qt5 version for compiling" ON) IF(${USE_QT5}) SET(USE_QT_VERSION 5) ELSE(${USE_QT5}) SET(USE_QT_VERSION 4) ENDIF(${USE_QT5}) # # SET(FILES_TO_TRANSLATE) IF(WIN32) IF(MSVC) SET (CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}:${QTDIR}\\msvc2015\\") ENDIF() IF(MinGW) SET (CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}:${QTDIR}\\mingw53_32\\") ENDIF() ENDIF() #disable -rdynamic # SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") # SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") # FILE (GLOB TRANSLATIONS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts) # OPTION (UPDATE_TRANSLATIONS "Update source translation ${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts" OFF) MESSAGE(STATUS "Qt version for compiling: " ${USE_QT_VERSION}) OPTION (USE_DEBUGGER "Include in binary file debug information" OFF) OPTION (USE_PROFILER "Include in binary file profiling information" OFF) IF(${USE_DEBUGGER}) SET(CMAKE_BUILD_TYPE Debug) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -Wall") ELSE() SET(CMAKE_BUILD_TYPE Release) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_RELEASE} -Wall") ENDIF() MESSAGE(STATUS "CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}") INCLUDE(CheckIncludeFile) INCLUDE(CheckIncludeFileCXX) INCLUDE(TestCXXAcceptsFlag) INCLUDE(CheckCXXCompilerFlag) SET(TARGET_NAME ponyprog ) SET(CMAKE_HELPERS_BINARY_DIR ${PROJECT_SOURCE_DIR}/cmake) SET(CMAKE_HELPERS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/cmake) LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") INCLUDE(OutOfSourceBuild) # Disallow in-source builds INCLUDE(GenerateDEF) # Convenience macro for linking Win32 DLLs using MSVC INCLUDE(Dependencies) SET(CURRENT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) INCLUDE(FindLibUSB-1.0) IF(NOT ${LIBUSB_VERSION} LESS "1.0.16") MESSAGE(STATUS "LibUSB version ${LIBUSB_VERSION}") ELSE() MESSAGE(FATAL_ERROR "-- LibUSB version ${LIBUSB_VERSION} TOO OLD! Please Install this library newer as 1.0.16") ENDIF() # Set the PonyProg version # this for generating of version file from HISTORY file # the idea is to descript all changes in this file, the ne changes are in the top of file FILE(READ "HISTORY" DESCRIBE_STRING) STRING(REGEX MATCH "([0-9]+\\.[0-9]+\\.[0-9]+)" APP_VERSION "${DESCRIBE_STRING}" ) MESSAGE(STATUS "Version info: ${APP_VERSION}") SET(VERSION ${APP_VERSION}) # # SET(APP_VERSION "3.0.0") SET(APP_AUTHOR "Claudio Lanconelli") SET(APP_EMAIL "PonyProg2000@gmail.com") SET(APP_NAME "PonyProg") IF(WIN32) EXECUTE_PROCESS ( COMMAND "cmd" " /c date /t" OUTPUT_VARIABLE APP_BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) ELSE() EXECUTE_PROCESS ( COMMAND date +"%d.%m.%Y" OUTPUT_VARIABLE APP_BUILD_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) STRING(REGEX REPLACE "\"" "" APP_BUILD_DATE ${APP_BUILD_DATE}) ENDIF() MESSAGE(STATUS "Version build date: ${APP_BUILD_DATE}") # SET(PONYPROG_PACKAGE ponyprog) SET(PONYPROG_HOST ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR}) SET(PONYPROG_COPYRIGHT "Copyright (c) 1997-2020 ${APP_AUTHOR}, All Rights Reserved.") SET(PONYPROG_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # Setup high-level build options # IF(MSVC) # SET(PONYPROG_ENABLE_SYMBOL_VISIBILITY_DEFAULT ON) # ELSE(MSVC) # SET(PONYPROG_ENABLE_SYMBOL_VISIBILITY_DEFAULT OFF) # ENDIF(MSVC) IF (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fno-exceptions") ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-exceptions") ENDIF() # options for gprof IF(${USE_PROFILER}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") # after execution of program: gprof ./build/ponyprog # and get the information from gprof.txt file MESSAGE(STATUS "Compile with profiling information") ELSE() MESSAGE(STATUS "Compile without profiling information") ENDIF() IF(${USE_QT_VERSION} MATCHES "4") SET(HAVE_QT_PRINTSUPPORT true) FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui REQUIRED) IF(NOT QT4_FOUND) MESSAGE(FATAL_ERROR "Qt4 could not be found. " "If it's INSTALLed in a non-standard location, specify the path to qmake in QT_QMAKE_EXECUTABLE. " "You can do it in interactive mode (ccmake instead of cmake) or using -DVAR=VAL syntax.") ENDIF() ELSE() FIND_PACKAGE(Qt5 COMPONENTS Core PrintSupport Gui Widgets Multimedia REQUIRED QUIET) IF(NOT Qt5Widgets_FOUND) MESSAGE(FATAL_ERROR "Qt5 could not be found. " "If it's INSTALLed in a non-standard location, specify the path to qmake in QT_QMAKE_EXECUTABLE. " "You can do it in interactive mode (ccmake instead of cmake) or using -DVAR=VAL syntax.") ENDIF(NOT Qt5Widgets_FOUND) IF(NOT Qt5PrintSupport_FOUND) MESSAGE(FATAL_ERROR "Qt5 PrintSupport development files are not found. " "Qt5PrintSupport development package is to install.") ENDIF(NOT Qt5PrintSupport_FOUND) IF(NOT Qt5Multimedia_FOUND) MESSAGE(FATAL_ERROR "Qt5 Multimedia development files are not found. " "Qt5Multimedia development package is to install.") ENDIF(NOT Qt5Multimedia_FOUND) ENDIF() #set ( FTDIPP ON ) FIND_PACKAGE ( LibFTDI1 NO_MODULE REQUIRED ) IF(NOT LibFTDI1_FOUND) MESSAGE(FATAL_ERROR "LibFTDI1 files are not found. " "LibFTDI1 and LibFTDIPP1 development packages are to install.") ENDIF(NOT LibFTDI1_FOUND) INCLUDE ( ${LIBFTDI_USE_FILE} ) # for this feature install debhelper or SET(PONYPROG_CPACK_PACKAGE_SHLIBDEPS ON) IF(${USE_QT_VERSION} MATCHES "4") INCLUDE_DIRECTORIES(${QT_INCLUDES} ${LIBUSB_INCLUDE_DIRS}) MESSAGE(STATUS "QT_INCLUDES ${QT_INCLUDES}") ELSE() INCLUDE_DIRECTORIES(${QT_INCLUDES} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5PrintSupport_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${LIBUSB_INCLUDE_DIRS}) MESSAGE(STATUS "QT_INCLUDES ${QT_INCLUDES} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} ${Qt5Multimedia_EXECUTABLE_COMPILE_FLAGS} ${Qt5PrintSupport_EXECUTABLE_COMPILE_FLAGS}") ENDIF() configure_file ( "${PROJECT_SOURCE_DIR}/SrcPony/version-cmake.h.in" "${PROJECT_SOURCE_DIR}/SrcPony/version.h" ) SET ( OBJECTS_DIR temp ) SET ( MOC_DIR temp ) SET ( UI_HEADERS_DIR temp ) SET ( UI_SOURCES_DIR temp ) ADD_SUBDIRECTORY(qhexedit2/src) ADD_SUBDIRECTORY(SrcPony) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/qhexedit2/src/ ${CMAKE_CURRENT_SOURCE_DIR}/SrcPony/ ) IF(${USE_QT_VERSION} MATCHES "4") # QT4_ADD_TRANSLATION(APP_TRANSLATIONS ${TRANSLATION}) QT4_WRAP_CPP(APP_HEADERS_MOC ${HEX_HEADERS} ${PONY_HEADERS} ) QT4_WRAP_UI(APP_FORMS_HEADERS ${PONY_FORMS} ) QT4_ADD_RESOURCES(APP_RESOURCES_RCC ${APP_RESOURCES}) ELSE() # QT5_ADD_TRANSLATION(APP_TRANSLATIONS ${TRANSLATION}) QT5_WRAP_CPP(APP_HEADERS_MOC ${HEX_HEADERS} ${PONY_HEADERS} ) QT5_WRAP_UI(APP_FORMS_HEADERS ${PONY_FORMS} ) QT5_ADD_RESOURCES(APP_RESOURCES_RCC ${APP_RESOURCES}) ENDIF() MESSAGE(STATUS "PONY_RESOURCES ${APP_RESOURCES_RCC}") INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) SOURCE_GROUP( "Generated Files" FILES ${MOC_FILES_CPP} ${APP_FORMS_HEADERS} ${APP_RESOURCES_RCC} ) IF(NOT ${USE_DEBUGGER}) ADD_DEFINITIONS(${QT_DEFINITIONS} -DQT_NO_DEBUG_OUTPUT -DQT_NO_DEBUG -DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) ELSE() ADD_DEFINITIONS(${QT_DEFINITIONS} -DQT_DEBUG) ENDIF() IF(${USE_QT_VERSION} MATCHES "4") INCLUDE(${QT_USE_FILE}) ADD_DEFINITIONS(${QT_DEFINITIONS} -DNO_QT3SUPPORT -DDISABLE_QT3SUPPORT -DQT_PROJECT) ELSE() ADD_DEFINITIONS(${Qt5Widgets_DEFINITIONS} ${Qt5PrintSupport_DEFINITIONS} ${Qt5Multimedia_DEFINITIONS} -DQT_PROJECT) ENDIF() IF(WIN32) ADD_DEFINITIONS(-DUNICODE -D_UNICODE) ENDIF() ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${APP_SOURCES} ${HEX_SOURCES} ${PONY_SOURCES} ${APP_HEADERS_MOC} ${APP_FORMS_HEADERS} # ${APP_TRANSLATIONS} ${APP_RESOURCES_RCC} ) IF(${USE_QT_VERSION} MATCHES "4") TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${QT_LIBRARIES} ${LIBUSB_LIBRARIES}) ELSE() TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${QT_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${Qt5PrintSupport_LIBRARIES} ${LIBUSB_LIBRARIES}) MESSAGE(STATUS "QT LIBRARIES: ${QT_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${Qt5PrintSupport_LIBRARIES} ${Qt5Core_LIBRARIES}") ENDIF() #target_link_libraries(${CMAKE_PROJECT_NAME} ${LIBFTDI_LIBRARIES} ) target_link_libraries(${CMAKE_PROJECT_NAME} ftdipp1 ${LIBFTDI_LIBRARIES} ) ADD_CUSTOM_TARGET (tags COMMAND ctags -R -f tags ${CMAKE_SOURCE_DIR}/SrcPony WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) # Setup module enabled/disabled defaults ... IF(MSVC) SET(PONYPROG_BUILD_GLX_MODULE_DEFAULT ON) SET(PONYPROG_BUILD_OSX_MODULE_DEFAULT OFF) SET(PONYPROG_BUILD_VIRTUAL_OFFSCREEN_MODULE_DEFAULT OFF) ENDIF(MSVC) IF(UNIX AND NOT APPLE) SET(PONYPROG_BUILD_GLX_MODULE_DEFAULT ON) SET(PONYPROG_BUILD_OSX_MODULE_DEFAULT OFF) SET(PONYPROG_BUILD_VIRTUAL_OFFSCREEN_MODULE_DEFAULT OFF) ENDIF(UNIX AND NOT APPLE) IF(APPLE) SET(PONYPROG_BUILD_GLX_MODULE_DEFAULT ON) SET(PONYPROG_BUILD_OSX_MODULE_DEFAULT ON) SET(PONYPROG_BUILD_VIRTUAL_OFFSCREEN_MODULE_DEFAULT OFF) ENDIF(APPLE) OPTION(PONYPROG_ENABLE_SYMBOL_VISIBILITY "Minimize the number of symbols exported from shared libraries." ${PONYPROG_ENABLE_SYMBOL_VISIBILITY_DEFAULT}) MARK_AS_ADVANCED(PONYPROG_ENABLE_SYMBOL_VISIBILITY) # OPTION(PONYPROG_ENABLE_TESTING "Build the Ponyprog regression test suite." OFF) # SET(BUILD_TESTING ${PONYPROG_ENABLE_TESTING} CACHE INTERNAL "" FORCE) # INCLUDE(CTest) # MARK_AS_ADVANCED(DART_TESTING_TIMEOUT) # IF(PONYPROG_ENABLE_TESTING) # CMAKE_MINIMUM_REQUIRED(VERSION 2.6.1 FATAL_ERROR) # CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake @ONLY) # ENDIF(PONYPROG_ENABLE_TESTING) # Capture system configuration INCLUDE(SystemConfiguration) # MSVC configuration IF(MSVC) IF(NOT MSVC) SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-runtime-pseudo-reloc" CACHE STRING "" FORCE) SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-runtime-pseudo-reloc -Wl,--export-all-symbols" CACHE STRING "" FORCE) ENDIF(NOT MSVC) ENDIF(MSVC) # Setup output directories ... SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PONYPROG_BINARY_DIR}/bin) IF(MSVC) SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PONYPROG_BINARY_DIR}/bin) ELSE(MSVC) SET(PONYPROG_LIBDIR lib) # Allows us to handle 64-bit libs if/when it becomes necessary. SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PONYPROG_BINARY_DIR}/${PONYPROG_LIBDIR}) ENDIF(MSVC) # Setup a macro for compiling resources ... MACRO(PONYPROG_COMPILE_RESOURCE OUTPUT INPUT RESOURCE_PATH) SET(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}") SET(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${INPUT}.cpp") GET_FILENAME_COMPONENT(OUTPUT_PATH ${OUTPUT_FILE} PATH) GET_TARGET_PROPERTY(PONYPROG_RESOURCE_COMPILER ponyprog-resource-compiler LOCATION) ADD_CUSTOM_COMMAND( DEPENDS ponyprog-resource-compiler DEPENDS ${INPUT_FILE} COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_PATH} COMMAND ${PONYPROG_RESOURCE_COMPILER} --input ${INPUT_FILE} --path \"${RESOURCE_PATH}\" --output ${OUTPUT_FILE} OUTPUT ${OUTPUT_FILE} COMMENT "Compiling resource ${INPUT_FILE}" ) LIST(APPEND ${OUTPUT} ${OUTPUT_FILE}) ENDMACRO(PONYPROG_COMPILE_RESOURCE) # Setup subdirectories ... PONYPROG_CONDITIONAL_BUILD(MSVC gendef) # OPTION(PONYPROG_ENABLE_DISTRIBUTION "Enable distribution targets." ON) PONYPROG_CONDITIONAL_BUILD(PONYPROG_ENABLE_DISTRIBUTION distribution) # Hide some cruft ... MARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY) MARK_AS_ADVANCED(CMAKE_EXECUTABLE_FORMAT) MARK_AS_ADVANCED(CMAKE_LIBRARY_OUTPUT_DIRECTORY) MARK_AS_ADVANCED(CMAKE_OSX_ARCHITECTURES) MARK_AS_ADVANCED(CMAKE_OSX_DEPLOYMENT_TARGET) MARK_AS_ADVANCED(CMAKE_OSX_SYSROOT) MARK_AS_ADVANCED(CMAKE_RUNTIME_OUTPUT_DIRECTORY) MARK_AS_ADVANCED(CMAKE_USE_CHRPATH) tmp9balx013/SrcPony/0000755000175000017500000000000013616566001014323 5ustar carstencarstentmp9balx013/SrcPony/forms/0000755000175000017500000000000013616566001015451 5ustar carstencarstentmp9balx013/SrcPony/forms/bitfield.ui0000644000175000017500000000507013616566001017574 0ustar carstencarsten FormBitField 0 0 495 371 0 0 Form QLayout::SetDefaultConstraint 0 0 0 0 0 0 0 0 0 0 true false Bit Description tmp9balx013/SrcPony/forms/osccalibr.ui0000644000175000017500000000521513616566001017754 0ustar carstencarsten OscCalibrDialog Qt::WindowModal 0 0 321 164 Dialog cancel Qt::Horizontal 40 20 QFrame::StyledPanel QFrame::Raised TextLabel TextLabel ok CheckBox read CheckBox tmp9balx013/SrcPony/forms/mainwindow.ui0000644000175000017500000004017413616566001020172 0ustar carstencarsten MainWindow 0 0 800 600 MainWindow 0 0 800 30 Fi&le De&vice &Command Sc&ript &Utility Se&tup ? Edit File Operations TopToolBarArea false Devices TopToolBarArea false Hardware Operations TopToolBarArea true Notes TopToolBarArea false :/icons/open20.png:/icons/open20.png &Open Device File :/icons/open_flash20x20.png:/icons/open_flash20x20.png Open Progra&m (FLASH) File... :/icons/open_eep20x20.png:/icons/open_eep20x20.png Open &Data (EEPROM) File... :/icons/save20.png:/icons/save20.png &Save Device File :/icons/save_flash20x20.png:/icons/save_flash20x20.png Sa&ve Program File (FLASH) As... :/icons/save_eep20x20.png:/icons/save_eep20x20.png Save Data &File (EEPROM) As... :/icons/reload20.png:/icons/reload20.png &Reload Files :/icons/script20x20.png:/icons/script20x20.png Script :/icons/print20x20.png:/icons/print20x20.png &Print... :/icons/setup20x20.png:/icons/setup20x20.png Setup :/icons/help20.png:/icons/help20.png &Help :/icons/rd_all20x20.png:/icons/rd_all20x20.png &Read All :/icons/rd_flash20x20.png:/icons/rd_flash20x20.png Read Program (&FLASH) :/icons/rd_eep20x20.png:/icons/rd_eep20x20.png Read &Data (EEPROM) :/icons/wr_all20x20.png:/icons/wr_all20x20.png &Write All :/icons/wr_flash20x20.png:/icons/wr_flash20x20.png Wr&ite Program (FLASH) :/icons/wr_eep20x20.png:/icons/wr_eep20x20.png Write Data (EEPRO&M) :/icons/erase20x20.png:/icons/erase20x20.png &Erase :/icons/lock20.png:/icons/lock20.png Lock :/icons/sernum20x20.png:/icons/sernum20x20.png Serial Number :/icons/edit20x20.png:/icons/edit20x20.png &Edit Note :/icons/ver_all20x20.png:/icons/ver_all20x20.png &Verify All :/icons/ver_flash20x20.png:/icons/ver_flash20x20.png Verif&y Program (FLASH) :/icons/ver_eep20x20.png:/icons/ver_eep20x20.png Verify Data (EEPROM) &Security and Configuration Bits... Reset :/icons/program20x20.png:/icons/program20x20.png &Program Progr&am Options... Read Osc.&Calibration Byte &Osc. Calibration Options... &Exit &Interface Setup... &Calibration Security Bits... &Load and Run... &Run &Clear Buffer &Fill Buffer... &Double Bank &Set SerialNumber S&erialNumber Config... &About Log Save Device File &As... true Edit &Buffer enabled About &Qt &ByteSwap Preferences tmp9balx013/SrcPony/forms/e2dlg.ui0000644000175000017500000010254613616566001017015 0ustar carstencarsten E2Dialog Qt::WindowModal 0 0 411 550 Dialog Qt::Horizontal 40 20 test cancel ok 3 USB QFrame::StyledPanel QFrame::Raised 0 0 -1 QComboBox::InsertAtTop Adapter Type 0 0 0 0 Detected S/N Custom Settings Clock Out Inverted Clock In Inverted Data Out Inverted Data In Inverted Control Out Inverted Control In Inverted Power On Inverted Enable OD Inverted Defaults Qt::Vertical 20 40 COM Serial port settings Adapter Type 0 0 -1 QComboBox::InsertAtTop Port Number 0 0 Custom Settings Clock Out false Inverted Data Out false Inverted Data In false Inverted Control Out false Inverted Defaults Qt::Vertical 20 40 LPT Custom Settings Clock Out false Inverted Clock In false false Inverted Data Out false Inverted Data In false Inverted Control Out false Inverted Defaults Qt::Vertical 20 40 Parallel port settings Adapter Type 0 0 -1 QComboBox::InsertAtTop Port Number 0 0 GPIO QFrame::StyledPanel QFrame::Raised Adapter Type 0 0 -1 QComboBox::InsertAtTop Port Number 0 0 Custom Settings Clock Out false Inverted Clock In false false Inverted Data Out false Inverted Data In false Inverted Control Out false Inverted Control In false false Inverted Power On false false Inverted Enable OD false false Inverted Defaults Qt::Vertical 20 40 tmp9balx013/SrcPony/forms/progoption.ui0000644000175000017500000000674113616566001020220 0ustar carstencarsten ProgOptDialog Qt::WindowModal 0 0 251 377 Dialog QFrame::StyledPanel QFrame::Raised CheckBox CheckBox CheckBox CheckBox CheckBox CheckBox CheckBox CheckBox CheckBox CheckBox cancel ok Qt::Horizontal 40 20 tmp9balx013/SrcPony/forms/notesdlg.ui0000644000175000017500000000414013616566001017626 0ustar carstencarsten NotesDialog Qt::WindowModal 0 0 447 126 Dialog QFrame::StyledPanel QFrame::Raised TextLabel TextLabel ok cancel Qt::Horizontal 40 20 tmp9balx013/SrcPony/forms/sernumcfg.ui0000644000175000017500000000656213616566001020012 0ustar carstencarsten SNCfgDialog Qt::WindowModal 0 0 290 330 Dialog QFrame::StyledPanel QFrame::Raised TextLabel TextLabel TextLabel cancel ok Qt::Horizontal 40 20 boo RadioButton RadioButton CheckBox CheckBox tmp9balx013/SrcPony/forms/editdlg.ui0000644000175000017500000000456613616566001017437 0ustar carstencarsten EditDialog Qt::WindowModal 0 0 240 195 Dialog QFrame::StyledPanel QFrame::Raised TextLabel TextLabel TextLabel ok cancel Qt::Horizontal 40 20 tmp9balx013/SrcPony/forms/prefdialog.ui0000644000175000017500000001433713616566001020134 0ustar carstencarsten PrefDialog 0 0 330 348 Preferences 1 Bus Speed TextLabel 0 0 TextLabel TextLabel TextLabel TextLabel TextLabel Timings TextLabel TextLabel TextLabel TextLabel TextLabel TextLabel Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() PrefDialog accept() 248 254 157 274 buttonBox rejected() PrefDialog reject() 316 260 286 274 tmp9balx013/SrcPony/forms/fusedlg.ui0000644000175000017500000000621113616566001017441 0ustar carstencarsten FuseDialog Qt::WindowModal 0 0 569 549 Dialog 0 0 0 Qt::Horizontal 588 20 Write Read cancel ok 0 0 TextLabel CheckBox CheckBox Qt::Horizontal tmp9balx013/SrcPony/forms/aboutdlg.ui0000644000175000017500000000425313616566001017615 0ustar carstencarsten AboutDialog Qt::WindowModal 0 0 400 300 Dialog ok help CheckBox 0 0 TextLabel Qt::AlignCenter TextLabel 0 0 TextLabel tmp9balx013/SrcPony/at250bus.cpp0000644000175000017500000001065013616566001016376 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at250bus.h" #include "errcode.h" #include #include At250Bus::At250Bus(BusInterface *ptr) : SPIBus(ptr), WriteEnable(0x06), WriteDisable(0x04), ReadStatus(0x05), WriteStatus(0x01), ReadData(0x03), WriteData(0x02), NotReadyFlag(1), WenFlag(2), BPFlags(8 + 4), loop_timeout(5000) { } void At250Bus::EndCycle() { //WaitUsec(1); setNCS(); ShotDelay(2); clearNCS(); ShotDelay(); } int At250Bus::ReadEEPByte(int addr) { int rv; SendDataByte(ReadData | (((addr >> 8) & 1) << 3)); SendDataByte(addr); ShotDelay(); rv = RecDataByte(); EndCycle(); return rv; } void At250Bus::WriteEEPByte(int addr, int data) { SendDataByte(WriteData | (((addr >> 8) & 1) << 3)); SendDataByte(addr); SendDataByte(data); EndCycle(); } int At250Bus::ReadEEPStatus() { int rv; SendDataByte(ReadStatus); rv = RecDataByte(); EndCycle(); return rv; } int At250Bus::WriteEEPStatus(int data) { SendDataByte(WriteEnable); EndCycle(); SendDataByte(WriteStatus); SendDataByte(data); EndCycle(); return 0; } int At250Bus::WaitEndOfWrite(int timeout) // 07/08/99 { if (timeout <= 0) { timeout = loop_timeout; } int k; for (k = timeout; k > 0 && (ReadEEPStatus() & NotReadyFlag); k--) { WaitUsec(50); } return (k != 0); } int At250Bus::Reset(void) { qDebug() << Q_FUNC_INFO; SPIBus::Reset(); ShotDelay(); //SendDataByte(WriteEnable); //EndCycle(); return OK; } long At250Bus::Read(int addr, uint8_t *data, long length, int page_size) { qDebug() << Q_FUNC_INFO << "(" << (hex) << addr << ", " << data << ", " << (dec) << length << ")"; long len; ReadStart(); for (len = 0; len < length; len++) { *data++ = (uint8_t)ReadEEPByte(addr++); if ((len % 10) == 0) { if (ReadProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush ReadEnd(); qDebug() << Q_FUNC_INFO << "=" << len; return len; } long At250Bus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); WriteEEPStatus(0); // 07/08/99 *** bug fix suggested by Atmel Product engineer if (!WaitEndOfWrite()) { return 0; } for (len = 0; len < length; len++) { SendDataByte(WriteEnable); EndCycle(); WriteEEPByte(addr++, *data++); if (!WaitEndOfWrite()) { return 0; //Must return 0, because > 0 (and != length) means "Abort by user" } if ((len & 1)) { if (WriteProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush WriteEnd(); return len; } tmp9balx013/SrcPony/wait.cpp0000644000175000017500000001064313616566001015777 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #ifdef Q_OS_LINUX #include #include #endif #include "e2cmdw.h" #include "busio.h" Wait::Wait() { if (htimer == -1) { CheckHwTimer(); } } Wait::~Wait() { } int Wait::bogokips = 0; int Wait::htimer = -1; #ifdef Q_OS_WIN32 LARGE_INTEGER Wait::mlpf; #endif //Check for a good hardware usec timer int Wait::CheckHwTimer() { #ifdef Q_OS_WIN32 LARGE_INTEGER i1, i2; htimer = 0; //Disable by default if (QueryPerformanceFrequency(&mlpf)) //return ticks per second if hw support high resolution timer { long usec = (long)(8 * mlpf.QuadPart / 1000000); //test with 5 usec int k; for (k = 0; k < 50; k++) { QueryPerformanceCounter(&i1); QueryPerformanceCounter(&i2); if ((i2.QuadPart - i1.QuadPart) < usec) { htimer = 1; //Enable for fast computers break; } } } #else struct timeval t1, t2; htimer = 0; //Disable by default int k; for (k = 0; k < 50; k++) { gettimeofday(&t1, NULL); gettimeofday(&t2, NULL); timersub(&t2, &t1, &t1); if (t1.tv_usec < 8) { htimer = 1; //Enable for fast computers break; } } #endif return htimer; } void Wait::SetHwTimer(int ok) { if (ok == 1) { htimer = 1; } else if (ok == 0) { htimer = 0; } else { CheckHwTimer(); } } void Wait::SetBogoKips() { Wait::bogokips = E2Profile::GetBogoMips(); } inline int Wait::GetBogoKips() { if (Wait::bogokips == 0) { SetBogoKips(); } return Wait::bogokips; } void Wait::WaitMsec(unsigned int msec) { #ifdef Q_OS_LINUX usleep(msec * 1000); #elif defined(Q_OS_WIN32) if (msec > 30) { Sleep(msec); } else { WaitUsec(msec * 1000); } #endif } /* Switch optimization OFF, so the compiler don't remove * the wait loop */ #ifndef __GNUC__ #pragma optimize( "", off ) #endif void Wait::WaitUsec(unsigned int usec) { if (usec == 0) { return; } if (htimer) { #ifdef Q_OS_WIN32 LARGE_INTEGER i1, i2; QueryPerformanceCounter(&i1); long i_usec = (long)(usec * mlpf.QuadPart / 1000000); do { QueryPerformanceCounter(&i2); } while ((long)(i2.QuadPart - i1.QuadPart) < i_usec); #else struct timeval t1, t2; gettimeofday(&t1, NULL); t2.tv_sec = 0; t2.tv_usec = usec; timeradd(&t1, &t2, &t1); do { gettimeofday(&t2, NULL); } while (timercmp(&t2, &t1, <)); // EK 2017 is it right??? #endif } else { volatile int k = usec * GetBogoKips() / 1000; while (k--) ; } } tmp9balx013/SrcPony/filldlg.cpp0000644000175000017500000001101013616566001016435 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include "e2cmdw.h" #include "types.h" #include "filldlg.h" class e2CmdWindow; FillDialog::FillDialog(QWidget *bw, long &cfrom, long &cto, int &cval, long max_addr, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } qDebug() << "FillDialog::FillDialog()"; pFrom = &cfrom; pTo = &cto; pVal = &cval; mMax = (max_addr > 0) ? max_addr : 0xFFFFFF; mFrom = (cfrom < 0) ? 0 : cfrom; mTo = (cto < 0) ? mMax : cto; mVal = (cval < 0) ? 0xFF : cval; lblFrom->setText(translate(STR_LBLFROM)); lblTo->setText(translate(STR_LBLTO)); lblVal->setText(translate(STR_LBLVALUE)); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); //TODO: should get strings from E2Profile settings, not local variables QString str; str = QString().sprintf("0x%04lX", mFrom); txiFrom->setText(str); str = QString().sprintf("0x%04lX", mTo); txiTo->setText(str); str = QString().sprintf("0x%02X", mVal); txiVal->setText(str); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } FillDialog::~FillDialog() { qDebug() << "FillDialog::~FillDialog()"; } void FillDialog::onOk() { bool good; bool bad = false; QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::black); //Color for good parameter txiFrom->setPalette(*palette); txiTo->setPalette(*palette); txiVal->setPalette(*palette); palette->setColor(QPalette::Text, Qt::red); //Color for bad parameter QString str = txiFrom->text(); mFrom = str.toLong(&good, 0); //0 accept both decimal and hex format (with 0x prefix) //Check from field format if (good == false) { txiFrom->setPalette(*palette); bad = true; } str = txiTo->text(); mTo = str.toLong(&good, 0); //Check to field format if (good == false) { txiTo->setPalette(*palette); bad = true; } str = txiVal->text(); mVal = str.toLong(&good, 0); //Check val field format if (good == false) { txiVal->setPalette(*palette); bad = true; } if (bad) { return; } //Check from field range if (mFrom >= mMax) { txiFrom->setPalette(*palette); bad = true; } //Check to field range if (mTo < mFrom || mTo > mMax) { txiTo->setPalette(*palette); bad = true; } //Check value field range if (mVal < 0 || mVal > 0xff) { txiVal->setPalette(*palette); bad = true; } if (bad) { return; } *pFrom = mFrom; *pTo = mTo; *pVal = mVal; accept(); } tmp9balx013/SrcPony/e24xx-5.h0000644000175000017500000000470513616566001015616 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E24XX5_H #define _E24XX5_H #include "e24xx.h" class E24xx5 : public E24xx { public: E24xx5(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~E24xx5(); // int Probe(int probe_size = 0); // int Read(int probe = 1, int type = ALL_TYPE); virtual int Write(int probe = 1, int type = ALL_TYPE); // int Verify(int type = ALL_TYPE); protected: // int bank_out(uint8_t const *copy_buf, int bank_no, long size = -1); // int bank_in(uint8_t *copy_buf, int bank_no, long size = -1); private: }; #endif tmp9balx013/SrcPony/lptinterf.h0000644000175000017500000000575313616566001016515 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _LPTINTERFACE_H #define _LPTINTERFACE_H #include #include "types.h" #define LPTCON_CLOSEHANDLE -1 #define LPTCON_GETVERSION 0 #define LPTCON_READ 10 #define LPTCON_WRITE_DATA 20 #define LPTCON_WRITE_CONTROL 30 #ifndef INVALID_HANDLE_VALUE #define INVALID_HANDLE_VALUE -1 #endif //Define the structure used to communicate to the VxD. typedef struct { int LPPort; //Port can be 1-3 uint8_t LPByte; //Data can be any value between 00 and FFh } LPTCONDATA; class LPTInterface { public: LPTInterface(); virtual ~LPTInterface(); void Close(); void SetPort(int port_no); int InDataPort(int port_no = -1); int OutDataPort(int val, int port_no = -1); int OutControlPort(int val, int port_no = -1); int OutDataMask(int mask, int val); virtual int OutControlMask(int mask, int val); int GetLastData() const { return last_data; } int GetLastCtrl() const { return last_ctrl; } protected: private: #ifdef Q_OS_LINUX int hLpt; #endif LPTCONDATA lpt_control; uint8_t last_ctrl, last_data; }; #endif tmp9balx013/SrcPony/e24xx-2.cpp0000644000175000017500000001727513616566001016154 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // 24XX-2 are I2C Bus eeproms that uses 16 bits (2 bytes) for addresses. // // Total capacity can be up to 64KBytes. // #include #include "types.h" #include "e2profil.h" #include "e2cmdw.h" #include "e24xx-2.h" // Header file #include "errcode.h" #include "eeptypes.h" E24xx2::E24xx2(e2AppWinInfo *wininfo, BusIO *busp) : E24xx(wininfo, busp), SecurityReadCode(0xC0), SecurityWriteCode(0x80), HEnduranceReadCode(0x40), HEnduranceWriteCode(0x00) { writepage_size = E2Profile::GetI2CPageWrite(); E2Profile::SetI2CPageWrite(writepage_size); } int E24xx2::Probe(int probe_size) { int rval = E24xx::Probe(probe_size); if (rval > 0) { long size = GetSize(); n_bank = 1; SetBankSize(size / n_bank); SetNoOfBank(n_bank); } return rval; } int E24xx2::Write(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } if (n_bank == 0) { return BADPARAM; } GetBus()->WriteStart(); long size = GetSize(); unsigned char *localbuf = new unsigned char[writepage_size + 2]; int rval = OK; if (type & PROG_TYPE) { long j; for (j = 0; j < size; j += writepage_size) { memcpy(localbuf + 2, GetBufPtr() + j, writepage_size); localbuf[0] = (uint8_t)((j >> 8) & 0xFF); localbuf[1] = (uint8_t)(j & 0xFF); if (GetBus()->Write(eeprom_addr[0], localbuf, 2 + writepage_size) != (2 + writepage_size)) { rval = GetBus()->Error(); break; } int k; for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[0], localbuf, 1) != 1; k--) { qApp->processEvents(); } if (k == 0) { rval = E2P_TIMEOUT; break; } if (GetBus()->WriteProgress(j * 100 / size)) { rval = OP_ABORTED; break; } } } GetBus()->WriteEnd(); delete[] localbuf; if (rval == OK) { return GetSize(); } else { return rval; } } int E24xx2::Read(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } GetBus()->ReadStart(); error = OK; if (type & PROG_TYPE) { uint8_t index[2]; long readpage_size = 256; long k; long size = GetSize(); for (k = 0; k < size; k += readpage_size) { //Scrive l'indice del sottoindirizzamento // partiamo sempre da 0. index[0] = (uint8_t)((k >> 8) & 0xFF); index[1] = (uint8_t)(k & 0xFF); if (GetBus()->StartWrite(eeprom_addr[0], index, 2) != 2) { error = GetBus()->Error(); break; } if (GetBus()->Read(eeprom_addr[0], GetBufPtr() + k, readpage_size) < readpage_size) { error = GetBus()->Error(); break; } if (GetBus()->ReadProgress(k * 100 / size)) { error = OP_ABORTED; break; } } } GetBus()->ReadEnd(); if (error == OK) { return GetSize(); } else { return error; } } int E24xx2::Verify(int type) { int rval = Probe(); //Moved here from 7 lines above (10/12/99) if (rval < 0) { return rval; } long readpage_size = 256; unsigned char *localbuf = new unsigned char[readpage_size]; GetBus()->ReadStart(); rval = 1; //true if (type & PROG_TYPE) { uint8_t index[2]; long k; long size = GetSize(); for (k = 0; k < size; k += readpage_size) { //Scrive l'indice del sottoindirizzamento // partiamo sempre da 0. index[0] = (uint8_t)((k >> 8) & 0xFF); index[1] = (uint8_t)(k & 0xFF); if (GetBus()->StartWrite(eeprom_addr[0], index, 2) != 2) { rval = GetBus()->Error(); break; } if (GetBus()->Read(eeprom_addr[0], localbuf, readpage_size) < readpage_size) { rval = GetBus()->Error(); break; } if (memcmp(GetBufPtr() + k, localbuf, readpage_size) != 0) { rval = 0; break; } if (GetBus()->ReadProgress(k * 100 / size)) { rval = OP_ABORTED; break; } } } GetBus()->ReadEnd(); delete[] localbuf; return rval; } int E24xx2::SecurityRead(uint32_t &blocks) { int rv = Probe(); //Determina gli indirizzi I2C if (rv > 0) { uint8_t buf[4]; buf[0] = 0xFF; buf[1] = 0xFF; buf[2] = SecurityReadCode; if (GetBus()->StartWrite(eeprom_addr[0], buf, 3) != 3) { return GetBus()->Error(); } int val; if ((val = GetBus()->ReadByte(0)) < 0) { return GetBus()->Error(); } blocks = (val << 4) & 0xF0; if ((val = GetBus()->ReadByte(1)) < 0) { return GetBus()->Error(); } blocks |= (val & 0x0F); GetBus()->Stop(); rv = OK; } else { rv = IICERR_NOADDRACK; } return rv; } int E24xx2::SecurityWrite(uint32_t blocks) { int rv = Probe(); //Determina gli indirizzi I2C if (rv > 0) { uint8_t buf[4]; int start_block = (blocks >> 4) & 0x0F; int no_of_block = blocks & 0x0F; buf[0] = 0x80 | (start_block << 1); buf[1] = 0xFF; buf[2] = SecurityWriteCode | (no_of_block & 0x3F); if (GetBus()->Write(eeprom_addr[0], buf, 3) != 3) { return GetBus()->Error(); } rv = OK; } else { rv = IICERR_NOADDRACK; } return rv; } int E24xx2::HighEnduranceRead(uint32_t &block_no) { int rv = Probe(); //Determina gli indirizzi I2C if (rv > 0) { uint8_t buf[4]; buf[0] = 0xFF; buf[1] = 0xFF; buf[2] = HEnduranceReadCode; if (GetBus()->StartWrite(eeprom_addr[0], buf, 3) != 3) { return GetBus()->Error(); } int val; if ((val = GetBus()->ReadByte(1)) < 0) { return GetBus()->Error(); } block_no = val & 0x0F; GetBus()->Stop(); rv = OK; } else { rv = IICERR_NOADDRACK; } return rv; } int E24xx2::HighEnduranceWrite(uint32_t block_no) { int rv = Probe(); //Determina gli indirizzi I2C if (rv > 0) { uint8_t buf[4]; buf[0] = 0x80 | (uint8_t)(block_no << 1); buf[1] = 0xFF; buf[2] = HEnduranceWriteCode; if (GetBus()->Write(eeprom_addr[0], buf, 3) != 3) { return GetBus()->Error(); } rv = OK; } else { rv = IICERR_NOADDRACK; } return rv; } tmp9balx013/SrcPony/x2444bus.h0000644000175000017500000000544613616566001016004 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _X2444BUS_H #define _X2444BUS_H #include "microbus.h" #include "device.h" class X2444Bus : public MicroWireBus { public: X2444Bus(BusInterface *ptr = 0); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); virtual void SetOrganization(int org) { if (org == ORG8 || org == ORG16) { organization = org; } } virtual int GetOrganization() const { return organization; } protected: void SendCmdAddr(int cmd, int addr); private: //Command Opcode const uint8_t ReadCode; const uint8_t WriteCode; const uint8_t WriteEnableCode; const uint8_t WriteDisableCode; const uint8_t RecallCode; const uint8_t StoreCode; const long loop_timeout; void setCS() { SetReset(); } void clearCS() { ClearReset(); } // int address_len; int organization; }; #endif tmp9balx013/SrcPony/icons/0000755000175000017500000000000013616566001015436 5ustar carstencarstentmp9balx013/SrcPony/icons/save20.png0000644000175000017500000000033513616566001017245 0ustar carstencarstenPNG  IHDR>PLTEcol[tRNS@fbKGDH pHYs  tIME .05DIDATc` XdT   B1AfJ`a C. Q `"9 RIENDB`tmp9balx013/SrcPony/icons/help20x20.png0000644000175000017500000000030213616566001017563 0ustar carstencarstenPNG  IHDR PLTEgR4tRNS@fbKGDH pHYs  tIME (RAt2IDATc`@@qU dk]"AR) tV7y;HIENDB`tmp9balx013/SrcPony/icons/write.png0000644000175000017500000000041513616566001017276 0ustar carstencarstenPNG  IHDRz<PLTEap>r$tRNS@fbKGDH pHYs  tIME /(}nIDAT͏1 E?Mu A^09p:) 9DFKK`CS-Mu1B4sԚ&O,/N*~Ĕ_O{b!ԈIENDB`tmp9balx013/SrcPony/icons/write20x20.png0000644000175000017500000000040313616566001017767 0ustar carstencarstenPNG  IHDR>PLTEap>r$tRNS@fbKGDH pHYs  tIME /13dIDATׅ1 0 "!Zz^ C]<:ADq Jn,9D(}ININ!5Hj}9?PLTEet-cUKtRNS@fbKGDH pHYs  tIME &lFIDATׅϱ DQ-qT?̞Usv 6b/aͬ%IB$eMIENDB`tmp9balx013/SrcPony/icons/print20.png0000644000175000017500000000035113616566001017441 0ustar carstencarstenPNG  IHDR>PLTEet-@.tRNS@fbKGDH pHYs  tIME *4SIDATו 0C]2AVH?SL{>=f_r. GfF#9|doD%^.Kp4@x^V5rntIENDB`tmp9balx013/SrcPony/icons/delete.png0000644000175000017500000000027613616566001017413 0ustar carstencarstenPNG  IHDR%=m"PLTEgtRNS@fbKGDH pHYs  tIME &0s^1IDATc````ba``7``~xD| 2 6,  L `|ʊIENDB`tmp9balx013/SrcPony/icons/open.png0000644000175000017500000000036413616566001017110 0ustar carstencarstenPNG  IHDRz<PLTEet-@.tRNS@fbKGDH pHYs  tIME *y^IDAT͎ 0D ]. d;1BDhF+cm'ٽӋ7ZU#]'y@$t=Pt!?{ ܒ7OIENDB`tmp9balx013/SrcPony/icons/open20x20.png0000644000175000017500000000035513616566001017604 0ustar carstencarstenPNG  IHDR>PLTEet-@.tRNS@fbKGDH pHYs  tIME *zWIDATׅ 0 SL*߉K">h=yi'}0KHt­sq?7l 5WIENDB`tmp9balx013/SrcPony/icons/print.png0000644000175000017500000000035213616566001017300 0ustar carstencarstenPNG  IHDRz<PLTEet-@.tRNS@fbKGDH pHYs  tIME **"TIDATc`HE(|AA B. l ##&`yAdy%FF$#|zPLTEapH1>tRNS@fbKGDH pHYs  tIME .DIDATc` X d4LaS3 ˁ@8 ,g0 LGAA(S DJL$Y hIENDB`tmp9balx013/SrcPony/icons/erase20x20.png0000644000175000017500000000036313616566001017741 0ustar carstencarstenPNG  IHDR PLTEe-g4tRNS@fbKGDH pHYs  tIME 'hr`IDATc`Ʃ @ )?H]mH C&PX!LI  $V? oȑZhhHH:TuIENDB`tmp9balx013/SrcPony/icons/sernum20x20.png0000644000175000017500000000026013616566001020147 0ustar carstencarstenPNG  IHDR PLTEg̽tRNS@fbKGDH pHYs  tIME ..A IDATc`BDI )"gSޱMkIENDB`tmp9balx013/SrcPony/icons/icon1.png0000644000175000017500000000070013616566001017152 0ustar carstencarstenPNG  IHDR Tg cHRMz&u0`:pQ<$PLTESE-tRNS@fbKGD tIME ;8C\IDAT(ϝ1r Et [YX3No2=37P:e:2+8(e~켿|(a:oZ# pQ.2$aa 2xm P^G vuVG>]t?_N3ԩ=s}N a-㼈iІ^Svz KKKdrKF.LΥW&aB#], ` H:v*#f؆5᪖OIENDB`tmp9balx013/SrcPony/icons/reload.png0000644000175000017500000000033713616566001017415 0ustar carstencarstenPNG  IHDR4 PLTEgtRNS@fbKGDH pHYs  tIME -S`OIDATc`0lVERV3BC ƕ l)C4ʀd)P]P٬а%0 U`S=,IENDB`tmp9balx013/SrcPony/icons/rd_flash20x20.png0000644000175000017500000000040013616566001020414 0ustar carstencarstenPNG  IHDR>PLTEcolWűtRNS@fbKGDH pHYs  tIME +,ҽ|gIDATU 0 @,b+`aptr`^ +#}&FoYEW}h ȟYL[㦅mm8l~ IENDB`tmp9balx013/SrcPony/icons/print20x20.png0000644000175000017500000000035113616566001017773 0ustar carstencarstenPNG  IHDR>PLTEet-@.tRNS@fbKGDH pHYs  tIME +kq!SIDATו 0C]2AVH?SL{>=f_r. GfF#9|doD%^.Kp4@x^V5rntIENDB`tmp9balx013/SrcPony/icons/lock20x20.png0000644000175000017500000000036113616566001017570 0ustar carstencarstenPNG  IHDR>PLTEet-cUKtRNS@fbKGDH pHYs  tIME )![IDATׅ 0D ]@>FcҟB8ue˘HlV+u\ 2cj>J1tԺ\PLTEcol0tRNS@fbKGDH pHYs  tIME )'wYVIDATc``,ff(Ӕ9&@fIil  `AP@6PQhs L11PPP0HQA0` IENDB`tmp9balx013/SrcPony/icons/rd_all20x20.png0000644000175000017500000000036413616566001020100 0ustar carstencarstenPNG  IHDR>PLTEet-աtRNS@fbKGDH pHYs  tIME +aE^IDATm D۸7 ?Rzy\O(B Fc:fFSz-GLp*il8f Y ifIENDB`tmp9balx013/SrcPony/icons/ver_flash20x20.png0000644000175000017500000000040013616566001020603 0ustar carstencarstenPNG  IHDR>PLTEcolWűtRNS@fbKGDH pHYs  tIME&SgIDATU @ Bi\D'0p`;~r酄EP0ɱu;e!dSZĬK3#[{cxd1= u IENDB`tmp9balx013/SrcPony/icons/program20x20.png0000644000175000017500000000027113616566001020307 0ustar carstencarstenPNG  IHDR PLTEgR4tRNS@fbKGDH pHYs  tIME + )IDATc` Q@Rj0ΆC@ 6OcgIENDB`tmp9balx013/SrcPony/icons/ponyprog.png0000644000175000017500000002062213616566001020023 0ustar carstencarstenPNG  IHDR~`PLTE !%)0 (+#6#1'@-4;."2!=!A L! H%'$\"A&,F)*&@.D/Z*M.A3 +.Q2:8B;d/ Z8R;:6U9*_<X@_AeB??cE ?xBdD@DDfKKMJkHwD'{FWSOOGhK;LK_S(H7tRSTRrR|P^V:W]wP8RQ}S1Kc.uW0Z[d\`AZYka?]'abjcb`~b'fe]bhMa@rk[Sc<`?dcg:deinTb=gQqp@mBe:mpbxs0msj_|>j7nlq6rtqp=rw\wv\o9tx{ssv?z|y}|tYp{~ouA{?yyƗA~}=>C~@~~̉f}xYA[:8<ӷ_9siJFpqUyԞnW}۞E×CCߒBÜ>dY?֘Pu梣cz֙^әjߜ9ßuUic妥AVڬodw㪆Хޮ!ٷ>lව}Ƚ{K#bqת{ĿZűӁSɹ{|xr(JtRNS@fbKGDH pHYs%%t;/tIME8"~ IDATx XSW%!!BfCo(4:jČ@]TjsAKM!֖i4Ttj[A]ERFPimǙθ߹7@bB>|J˛{|ȷgG^Kna-+CV=dev7Y>-vOz<.|߽NelumH[q;:UK?d'6dflmڪ~ުeÓCֆ ey2m֮Ći&KP7Гؐ{lC6}ɺX:?wޱĠnl-eGazy#͋־H˶&rӆriٰӖ{ [M`/N/U@\=nWiZ_CBv}WyQOǁ%&: _2e>Dd]Yr "-!u,yE<=HwE]J|ȀwWh:kmiKFLZ6QSbvK`N.Jcq*hns{TrbZdgT­GRHkK_xQ!K~κ}[@̪8:O*# S32kIsﷹd2ϯ /qOtG JGfK7mkkk_( gOB uv_Cz1Q_f2'Kv8 ūՄ$0 lTti\ t6/~}eً(h-HV`QbP |yʧ˖ myYynzt4Ngc2@sdG7+"JݗggyyV TDJ#i?'.h< ~vWvnl_gPUdb;BBP؂cg %N$0޽qF4nҚf{o^hO^I E!2B \v3:< *i?<&ID&RTnP:A#uoNg7{duښ oWƅp6?Q% $ƣMVIw__%__j_n__j4k'+l18 d_wKPu:vmkoL'7G+ bq֛~ YW@cm{"urB0Rn B6m&yPM]Q gUXAAL'Alp|[ė#LݥKmv*ASdb$Cy œ_;?dg]ΒTYI۞B eid8&j=!pƓ<Ȓu.K+?rPqJ.$F[ <ӆ2"m-:ZdԴX *fЩp@|WNndG=+o*kKzqvF '8| %s/'*[KJjZ^z|~Rڢ{ z`gO!R+UC`YR֓dr .S%\bϽo<9m]'O`_f. }ySSUR(F7E}Lg!$j$ gظůMƬ,ف6,DgsfZi槖OE/4k ٬#q2\(di2+8 K>j̛3Hf\7` Y7OP$|q(! r@EFW(Kܧ=\OR+S |k(KN$T >O R?YolmdƜ,Y^Rvӡ(ȉ'l0U9)5+Kho+eFŠ7Sï)z+e^N&Oh\aPʟut],^gZ;'٬OI qŪ#Cq܁b@0~?6O$7[7h."Kh2>Roh Dۺ/jj^;WI\#0 cN:dn|nqRʶo(bm)0.&@hǂ%1dzzz~A2Oe 6K*d8 gttj; 㪶yqow}:X $ٻЯ/{-%V,A`X'ƂW׮ +YPٍsou~v]zm+8uѸb\"VF vqγuGdg?hr:(Jo<첒VLRSBaǠaID? LsW5"`=7.4BmqVVB٤78J$-:Ul(pTz4g+~0&RƵ?tv0y .cX ( Z-E!m*BDGyP8BC^CgW*nnFg0V+IB -" .T\hJh`W_\Iv,ѼK󟏩t,GL6j,2D`8r dѸ(lȮu ?SOIY!~gN3Eᡣdc`*%B6 Mn #8E1j21ǚ^P@&!Wj XEr:A`@6헟@N:"t@^GPSօj(V8e\:݆8,ʼn~wx@]_87yD255Sf' EQ,8yFg= [ۋPqod@ݸܫ&GMM1x3=+@?͔}d r ~Au%: 2t:"4' Lt b1p>@./Lϡ*,ǰ*(Г)$Ih B%䈔xGŦD WBd,nٽaBURRBR$&D a 6kb+-9@SHav{<ݑKF(,K2(U$\.|$cV|ک- +4V /kvgRXXHhơ$eR^h2Ix?_k(޼~99j!:e1;mҤGd* 2m 8]e׋JJߕ9N?D Knsزf`@R1"cK@{abYy az:gd%fl-M4څ)P" 9a-pD/nDOi2%'V`OȌ&xq,rB2 Z֧{5t6g*pBn22J-Yw Xr@٣"6KA<xظ>vrAZþߒe߷㏋ffIKAj0b*;(Q8VB ,9WʜY9e.ñ,QvM[,!7r)m2GRSV٫[eF2pN8G E j.}sK^~Z_h:XWxeS4ԺY ڪ$Gs]t06K\^ ˠɎ:3вXJݏΚ& QXHBT,X1.͙0;QP!D(2vta}R;ۣr8MȂf . , 6%`ѝwѶ_:~ij:$H9)Wh&2x6ztãdJͶ>WwZk)E+d\M'd Urh,&1 袓&S=~Zqycمc%Bl,^JFs(Ts&L@Páɢ(k[}5{N83'N}|iSu i-*dDD62 X4Y ju2ݽ{d݄}d& 5jNbF`l\ )gdQ@;Jf6u+g$T‡hӧڜa6zB&MJ*"ԛU{tfze3w\?Cٻgz~Q9vֹ:]GsLKѩg!Ce*NG-"S=)riZ|sc>$O| ijs;:F'lTxO'N@dQ'WeOgjtOIS&%͙d$ l jZAGseBd+gFdA*Gӥv셶SD7K\HhEy׃C;smѣUUΦvRe2H cZ/j?T(_{>FYGU]v[ e0@꒒{C{<OU .O.v֢jB^$6i0(!W;w? ;gW=tWȲ VЙ%@LQ6;b+Gznh jm]^TDR_Oj0ⲟ IF unG`eQx9LQCS#_\h)S^#F%ia9ȱ7رh ӵ3_yGua!U>imme /![Fhdo}h顴̢c?<^;0/yYY0tNZ"[1'̬zCsRӟklzhP5TTl߲1o͚-;=Wmo6qR4.}wur^$\VѬQA$_iFU,)k>cOY*ÏyM} tlpc~Fkߧodq~A>Thr764z(!ijwG'?|R;;.!R:I]z$HNB: Of뻚DN\'yw w qH0n4ϞnjvBdѺ8F *yqu}$i6}25tvį3v2I:f#͇dJ׀nz:&^&ȋ;aRIW 62S?dvΘtc3 I> )i Dkݑ əWmw{9h^׺3Ǻ|Hn]@{]@"s{\fy&gF׏]:5@2ܹ;s=?6˓cNzs]##'q2P 7bƇ ^yomϡ X,x!s_7ƹ=K8x{aK Nتg>F^jipx-~! 1oA;vzV{ eWQ~n&%xS^__`Ƃ<.A 6fG L+U}\~o"Q ?X]910o?_ # q~nhwzmEU^^@ ǜz!~zA ll .".ȸAo'# l+9N:f`.;q3vwg0qF?A2h _yߝߝGrW}{O>[SaY/CRHK=(-~JIENDB`tmp9balx013/SrcPony/icons/read20x20.png0000644000175000017500000000034013616566001017550 0ustar carstencarstenPNG  IHDR PLTEe-g%ѴtRNS@fbKGDH pHYs  tIME ,:i(_xMIDATc`  XQne@5oI 4Y'qy!nIENDB`tmp9balx013/SrcPony/icons/save.png0000644000175000017500000000033313616566001017101 0ustar carstencarstenPNG  IHDR {PLTEcol[tRNS@fbKGDH pHYs  tIME . cBIDATc`#`(Q1`\AWP,I\e=Fp H\(ya iLx a0IENDB`tmp9balx013/SrcPony/icons/help20.png0000644000175000017500000000030213616566001017231 0ustar carstencarstenPNG  IHDR PLTEgR4tRNS@fbKGDH pHYs  tIME '5c"2IDATc`@@qU dk]"AR) tV7y;HIENDB`tmp9balx013/SrcPony/icons/copy.png0000644000175000017500000000032213616566001017113 0ustar carstencarstenPNG  IHDRb PLTEe-ga~tRNS@fbKGDH pHYs  tIME ( \F?IDATc` QDVY50F{dŭB+BA,n Zw_V8WIENDB`tmp9balx013/SrcPony/icons/open20.png0000644000175000017500000000035513616566001017252 0ustar carstencarstenPNG  IHDR>PLTEet-@.tRNS@fbKGDH pHYs  tIME * KWIDATׅ 0 SL*߉K">h=yi'}0KHt­sq?7l 5WIENDB`tmp9balx013/SrcPony/icons/read20.png0000644000175000017500000000034013616566001017216 0ustar carstencarstenPNG  IHDR PLTEe-g%ѴtRNS@fbKGDH pHYs  tIME ,*tOMIDATc`  XQne@5oI 4Y'qy!nIENDB`tmp9balx013/SrcPony/icons/wr_flash20x20.png0000644000175000017500000000037213616566001020447 0ustar carstencarstenPNG  IHDR>PLTEcolWűtRNS@fbKGDH pHYs  tIME /aIDATU [1(q>"G X{rc|#lTw:8+tBWlײI:c hJW^IENDB`tmp9balx013/SrcPony/icons/setup20x20.png0000644000175000017500000000036013616566001017777 0ustar carstencarstenPNG  IHDR PLTEe-g4tRNS@fbKGDH pHYs  tIME .8\]IDATc`@m$x@< H`f" 7D25H@@@s@ѫ 1l0m 9q_IENDB`tmp9balx013/SrcPony/icons/edit20x20.png0000644000175000017500000000035713616566001017572 0ustar carstencarstenPNG  IHDR>PLTEcolcbTtRNS@fbKGDH pHYs  tIME 'VIDATc` A@P4 C%E4( W Q((( tdDELRh L0\T YUIENDB`tmp9balx013/SrcPony/icons/wr_all20x20.png0000644000175000017500000000034113616566001020116 0ustar carstencarstenPNG  IHDR PLTEe-g4tRNS@fbKGDH pHYs  tIME /c!NIDATc`)1 Ȯu m` b3@e@6kh(HXE@f ZHC,D%IoIENDB`tmp9balx013/SrcPony/icons/new.png0000644000175000017500000000036013616566001016734 0ustar carstencarstenPNG  IHDRz<PLTEet-@.tRNS@fbKGDH pHYs  tIME )(\OZIDATc`=0```f`0`6"0`0Fh`tqDEP| p ]@n1oEl>н1()))`3!#CIENDB`tmp9balx013/SrcPony/icons/wr_eep.png0000644000175000017500000000036713616566001017433 0ustar carstencarstenPNG  IHDRz<PLTEcol tRNS@fbKGDH pHYs  tIME / ^IDATc`:`@:T |a8IIE( */(("h z@T7DYԣn3KIENDB`tmp9balx013/SrcPony/icons/cut.png0000644000175000017500000000030213616566001016732 0ustar carstencarstenPNG  IHDRb PLTEg tRNS@fbKGDH pHYs  tIME &&2IDATc`B$H8 VR$8VM LB(bkIENDB`tmp9balx013/SrcPony/icons/lock.png0000644000175000017500000000036313616566001017076 0ustar carstencarstenPNG  IHDRz<PLTEet-,ެtRNS@fbKGDH pHYs  tIME +4]IDATӽ 0Ab& `b* EJwfH-D2@J;{5ߡb l*cpugA RIENDB`tmp9balx013/SrcPony/icons/save_eep20x20.png0000644000175000017500000000036213616566001020430 0ustar carstencarstenPNG  IHDR>PLTEorm'i\tRNS@fbKGDH pHYs  tIME -4C>VIDATc`@` d  )KRKK40Ղ$5LZ% i@a:34:  6d"9*X~IENDB`tmp9balx013/SrcPony/icons/script20x20.png0000644000175000017500000000031513616566001020143 0ustar carstencarstenPNG  IHDR>PLTEet-աtRNS@fbKGDH pHYs  tIME .&Oa7IDATc` A4qd&)(g": +"(#%%$aK^V2IENDB`tmp9balx013/SrcPony/icons/find.png0000644000175000017500000000031313616566001017061 0ustar carstencarstenPNG  IHDRb PLTEg̽tRNS@fbKGDH pHYs  tIME '(;IDATc`Q 1Ab u`` Iu` ` L @"4$4!Ձ J:0@ @IENDB`tmp9balx013/SrcPony/icons/write20.png0000644000175000017500000000040313616566001017435 0ustar carstencarstenPNG  IHDR>PLTEap>r$tRNS@fbKGDH pHYs  tIME /;5<-dIDATׅ1 0 "!Zz^ C]<:ADq Jn,9D(}ININ!5Hj}9?PLTEcol tRNS@fbKGDH pHYs  tIME¸dIDATm @ C\Npvӓ?!$f,NE j;a]]1)"0"W& t~ 9{aӇ 4IENDB`tmp9balx013/SrcPony/icons/help.png0000644000175000017500000000030613616566001017073 0ustar carstencarstenPNG  IHDR+ PLTEe-gytRNS@fbKGDH pHYs  tIME '#.s3IDATc` @hO ? PD;T (C'U+ U7CFIENDB`tmp9balx013/SrcPony/icons/paste.png0000644000175000017500000000036613616566001017265 0ustar carstencarstenPNG  IHDRRPLTEorm@ItRNS@fbKGDH pHYs  tIME *!1ZIDATc`@FA%*b ; :;201!PQPP1"XD--M ,d)EԔ"iI%$ PGIENDB`tmp9balx013/SrcPony/icons/rd_eep.png0000644000175000017500000000036413616566001017405 0ustar carstencarstenPNG  IHDRz<PLTEet-MLtRNS@fbKGDH pHYs  tIME +w^IDATc`D 00 2(90 0@#\P= 4EQ p [JQ Tw!GUn}kIENDB`tmp9balx013/SrcPony/icons/rd_eep20x20.png0000644000175000017500000000037413616566001020102 0ustar carstencarstenPNG  IHDR>PLTEcol tRNS@fbKGDH pHYs  tIME +#BacIDATm @ C[\A'8nWØV=0y4du;-;x]Wz_ Q 4ѝ2. [6,\c R IENDB`tmp9balx013/SrcPony/icons/open_eep20x20.png0000644000175000017500000000037313616566001020435 0ustar carstencarstenPNG  IHDR>PLTEcol tRNS@fbKGDH pHYs  tIME )0B#bIDATU NR:@ ,͋~<G@R/-?U f !j{oTR/nG}# Eur=sTȕmXF>z. bIENDB`tmp9balx013/SrcPony/icons/wr_eep20x20.png0000644000175000017500000000037013616566001020121 0ustar carstencarstenPNG  IHDR>PLTEcol tRNS@fbKGDH pHYs  tIME /1_IDATmM h cV5KVC,6I{h.rT]t4<اKzN" kL0T3ٚ]DHs hlIENDB`tmp9balx013/SrcPony/icons/lock20.png0000644000175000017500000000036113616566001017236 0ustar carstencarstenPNG  IHDR>PLTEet-cUKtRNS@fbKGDH pHYs  tIME )܈[IDATׅ 0D ]@>FcҟB8ue˘HlV+u\ 2cj>J1tԺ\/?J) AJј+v\ab!đH9QWyÔ p3PLTEorm"ftRNS@fbKGDH pHYs  tIME .sdSIDATc`@` d  )K66NK40͒Ͱ0g {ELc03M@`!k30HN-TWIENDB`tmp9balx013/SrcPony/icons/open_flash20x20.png0000644000175000017500000000037613616566001020764 0ustar carstencarstenPNG  IHDR>PLTEcol!btRNS@fbKGDH pHYs  tIME )9VeIDATm D['l|8 bD.ǃ" 1?bE80/nRvd}-hIwRZS ɺPLTEet-աtRNS@fbKGDH pHYs  tIMEX`IDATm 0 @-6:LuZ N|Df ,t4hfDl ܹ8z Ulۋ4Q|~p 46TC j^ VIENDB`tmp9balx013/SrcPony/pic16xx.h0000644000175000017500000000550713616566001016005 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PIC16XX_H #define _PIC16XX_H #include "types.h" #include "device.h" #include "picbus.h" class Pic16xx : public Device { public: Pic16xx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~Pic16xx(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); int Erase(int probe = 1, int type = ALL_TYPE); //Write lock bits int SecurityRead(uint32_t &bits); int SecurityWrite(uint32_t bits); protected: PicBus *GetBus() { return static_cast(Device::GetBus()); } uint16_t id_locations[8]; /** int ReadProg(); int ReadData(); int WriteProg(); int WriteData(); int VerifyProg(unsigned char *localbuf); int VerifyData(unsigned char *localbuf); **/ virtual int CodeProtectAdjust(uint16_t &config, int read = 0); private: }; #endif tmp9balx013/SrcPony/wait.h0000644000175000017500000000462013616566001015442 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _WAIT_H #define _WAIT_H #include #ifdef Q_OS_WIN32 #include "windows.h" #endif class Wait { public: Wait(); virtual ~Wait(); void WaitMsec(unsigned int msec); void WaitUsec(unsigned int usec); void SetBogoKips(); int GetHwTimer() const { return htimer; } void SetHwTimer(int ok = -1); int CheckHwTimer(); protected: int GetBogoKips(); private: static int bogokips; static int htimer; #ifdef Q_OS_WIN32 static LARGE_INTEGER mlpf; #endif }; #endif tmp9balx013/SrcPony/crc.h0000644000175000017500000000102513616566001015241 0ustar carstencarsten#include #include "types.h" /* Calcola il CRC in un file a partire da ini_ofs per un numero di bytes dato da len. Se len e` zero prosegue fino alla fine del file, il file deve essere aperto in modo da permettere la lettura (r, r+, w+) */ uint16_t fcalc_crc(QFile &fh, long ini_ofs, long len); /* Calcola il CRC in una zona di memoria a partire da ini_addr per un numero di bytes dato da len */ uint16_t mcalc_crc(void *ini_addr, long len); /* update crc reverse */ uint16_t updcrcr(uint16_t crc, uint16_t code); tmp9balx013/SrcPony/prefdialog.h0000644000175000017500000000436413616566001016617 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef PREFDIALOG_H #define PREFDIALOG_H #include namespace Ui { class PrefDialog; } class PrefDialog : public QDialog { Q_OBJECT public: explicit PrefDialog(QWidget *parent, const QString title); ~PrefDialog(); private slots: void on_buttonBox_accepted(); private: Ui::PrefDialog *ui; }; #endif // PREFDIALOG_H tmp9balx013/SrcPony/portint.cpp0000644000175000017500000004660513616566001016541 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include #include #include #include #include "globals.h" #include "portint.h" #include "errcode.h" #include "e2cmdw.h" #ifdef Q_OS_LINUX #include #if (defined(__x86_64__) || defined(__i386__)) //Qt5 defined(Q_PROCESSOR_X86) #include int PortInterface::IOperm(int a, int b, int c) { int retval = -1; qDebug() << "PortInterface::IOPerm(" << (hex) << a << ", " << b << ", " << c << (dec) << ")"; if (a + b <= 0x400) //access to other ports needs iopl(3) { retval = ioperm(a, b, c); } qDebug() << "PortInterface::IOPerm() " << retval; return retval; } #else int PortInterface::IOperm(int a, int b, int c) { return -1; } #define outb(x, p) #define inb(p) 0 #endif #endif #ifdef Q_OS_WIN32 int PortInterface::IOperm(int a, int b, int c) { return 0; } #endif enum LptRegs { dataOfst, statOfst, ctrlOfst }; enum UartRegs { thrOfst, ierOfst, iirOfst, lcrOfst, mcrOfst, lsrOfst, msrOfst }; PortInterface::PortInterface() { qDebug() << "PortInterface::PortInterface()"; int k; for (k = 0; k < MAX_COMPORTS; k++) { ser_ports[k].base = 0; ser_ports[k].len = 8; } for (k = 0; k < MAX_LPTPORTS; k++) { par_ports[k].base = 0; par_ports[k].len = 8; } // ser_ports_base[0] = 0x3F8; // ser_ports_base[1] = 0x2F8; // ser_ports_base[2] = 0x3E8; // ser_ports_base[3] = 0x2E8; // par_ports_base[0] = 0x378; // par_ports_base[1] = 0x278; // par_ports_base[2] = 0x3BC; #ifdef Q_OS_LINUX lcr_copy = ier_copy = -1; #endif #ifdef Q_OS_WIN32 gfpOut32 = NULL; gfpInp32 = NULL; gfpIsInpOutDriverOpen = NULL; gfpIsXP64Bit = NULL; //Dynamically load the DLL at runtime (not linked at compile time) hInpOutDll = LoadLibrary(L"inpout32.dll"); //The 32bit DLL. If we are building x64 C++ //application then use InpOutx64.dll if (hInpOutDll != NULL) { gfpOut32 = (lpOut32)GetProcAddress(hInpOutDll, "Out32"); gfpInp32 = (lpInp32)GetProcAddress(hInpOutDll, "Inp32"); gfpIsInpOutDriverOpen = (lpIsInpOutDriverOpen)GetProcAddress(hInpOutDll, "IsInpOutDriverOpen"); gfpIsXP64Bit = (lpIsXP64Bit)GetProcAddress(hInpOutDll, "IsXP64Bit"); if (!gfpIsInpOutDriverOpen()) { qDebug() << "Unable to open InpOut32 Driver!"; //All done FreeLibrary(hInpOutDll); hInpOutDll = NULL; } } else { qDebug() << "Unable to load InpOut32 DLL!"; } #endif cpwreg = read_port = write_port = 0; first_port = last_port = no_ports = 0; qDebug() << "PortInterface::PortInterface() O"; } PortInterface::~PortInterface() { qDebug() << "PortInterface::~PortInterface()"; #ifdef Q_OS_WIN32 if (hInpOutDll != NULL) { //All done FreeLibrary(hInpOutDll); hInpOutDll = NULL; } #endif } int PortInterface::InPort(int nport) const { qDebug() << "PortInterface::OutPort() ** " << (hex) << first_port << ", " << nport << (dec); #ifdef Q_OS_WIN32 if (gfpInp32 == NULL) { return E2ERR_OPENFAILED; } #endif if (first_port == 0) { return E2ERR_NOTINSTALLED; } if (nport < 0 || nport >= no_ports) //use default read port { nport = read_port; } else { nport += first_port; } #ifdef Q_OS_WIN32 return gfpInp32(nport); #else return inb(nport); #endif } int PortInterface::OutPort(int val, int nport) { qDebug() << "PortInterface::OutPort() ** " << (hex) << first_port << ", " << last_port << (dec); #ifdef Q_OS_WIN32 if (gfpOut32 == NULL) { return E2ERR_OPENFAILED; } #endif if (first_port == 0) { return E2ERR_NOTINSTALLED; } if (nport < 0 || nport >= no_ports) { nport = write_port; } else { nport += first_port; } if (nport == write_port) { cpwreg = val; } qDebug() << "PortInterface::outb(" << (hex) << val << ", " << nport << (dec) << ")"; #ifdef Q_OS_WIN32 gfpOut32(nport, val); #else outb(val, nport); #endif return OK; } int PortInterface::OutPortMask(int mask, int val) { qDebug() << "PortInterface::OutPortMask(" << mask << ", " << val << ")"; #ifdef Q_OS_WIN32 if (gfpOut32 == NULL) { return E2ERR_OPENFAILED; } #endif if (write_port == 0) { return E2ERR_NOTINSTALLED; } if (val == 0) //clear the bit 1's in the mask (other bits unchanged) { cpwreg &= ~mask; } else if (val == 1) //set the bit 1's in the mask (other bits unchanged) { cpwreg |= mask; } else //toggle the bit 1's in the mask (other bits unchanged) { cpwreg ^= mask; } qDebug() << "PortInterface::outb(" << (hex) << cpwreg << ", " << (dec) << write_port << ")"; #ifdef Q_OS_WIN32 gfpOut32(write_port, cpwreg); #else outb(cpwreg, write_port); #endif return OK; } int PortInterface::OpenPort(const base_len *ports) { qDebug() << "PortInterface::OpenPort(" << (hex) << ports->base << (dec) << ", " << ports->len << ") I"; int ret_val = E2ERR_OPENFAILED; // PC ISA ports have only 10 bit addresses // check for the access to ports is granted if (ports->base >= 0x100 && ports->len > 0) { // request the access to I/O ports if (IOperm(ports->base, ports->len, 1) == 0) { ClosePort(); // close any opened port first_port = ports->base; last_port = ports->base + ports->len - 1; no_ports = ports->len; ret_val = OK; } else { first_port = last_port = no_ports = 0; ret_val = E2ERR_ACCESSDENIED; } } qDebug() << "PortInterface::OpenPort() = " << ret_val << " O"; return ret_val; } void PortInterface::ClosePort() { qDebug() << "PortInterface::ClosePort() I"; if (first_port && last_port && no_ports) { IOperm(first_port, no_ports, 0); } first_port = last_port = no_ports = 0; qDebug() << "PortInterface::ClosePort() O"; } int PortInterface::OpenSerial(int no) { qDebug() << "PortInterface::OpenSerial(" << no << ") I"; int ret_val = E2ERR_OPENFAILED; if (no >= 0 && no < MAX_COMPORTS) { if (ser_ports[no].base == 0) { DetectPorts(); } //Test if port exist if (ser_ports[no].base > 0) { #ifdef Q_OS_WIN32 //Test if port is already in use QString str = E2Profile::GetCOMDevName() + QString::number(no + 1); hCom = CreateFile((LPCWSTR)str.utf16(), GENERIC_READ | GENERIC_WRITE, 0, // comm devices must be opened w/exclusive-access NULL, // no security attrs OPEN_EXISTING,// comm devices must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom != INVALID_HANDLE_VALUE) { GetCommMask(hCom, &old_mask); SetCommMask(hCom, 0); ret_val = OpenPort(&ser_ports[no]); if (ret_val == OK) { write_port = GetFirstPort() + mcrOfst; read_port = GetFirstPort() + msrOfst; cpwreg = 0; } else { CloseSerial(); } } #else //Linux ret_val = OpenPort(&ser_ports[no]); if (ret_val == OK) { lcr_copy = inb(GetFirstPort() + lcrOfst); outb(0, GetFirstPort() + lcrOfst); ier_copy = inb(GetFirstPort() + ierOfst); outb(0, GetFirstPort() + ierOfst); write_port = GetFirstPort() + mcrOfst; read_port = GetFirstPort() + msrOfst; cpwreg = 0; } #endif } } qDebug() << "PortInterface::OpenSerial() = " << ret_val << " O"; return ret_val; } void PortInterface::CloseSerial() { #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { SetCommMask(hCom, old_mask); CloseHandle(hCom); hCom = INVALID_HANDLE_VALUE; } #else #define BREAK_MASK 0x40 if (lcr_copy != -1 && ier_copy != -1) { outb(lcr_copy & ~BREAK_MASK, GetFirstPort() + lcrOfst); outb(ier_copy, GetFirstPort() + ierOfst); lcr_copy = ier_copy = -1; } #endif read_port = write_port = 0; ClosePort(); } int PortInterface::OpenParallel(int no) { int ret_val = E2ERR_OPENFAILED; if (no >= 0 && no < MAX_LPTPORTS) { if (par_ports[no].base == 0) { DetectPorts(); } //Test if port exist if (par_ports[no].base) { #ifdef Q_OS_WIN32 QString str = E2Profile::GetLPTDevName() + QString::number(no + 1); hCom = CreateFile((LPCWSTR)str.utf16(), GENERIC_READ | GENERIC_WRITE, 0, // comm devices must be opened w/exclusive-access NULL, // no security attrs OPEN_EXISTING,// comm devices must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom != INVALID_HANDLE_VALUE) { ret_val = OpenPort(&par_ports[no]); if (ret_val == OK) { write_port = GetFirstPort() + dataOfst; read_port = GetFirstPort() + statOfst; cpwreg = 0; } else { CloseParallel(); } } #else //Linux ret_val = OpenPort(&par_ports[no]); if (ret_val == OK) { write_port = GetFirstPort() + dataOfst; read_port = GetFirstPort() + statOfst; cpwreg = 0; } #endif } } return ret_val; } void PortInterface::CloseParallel() { #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { CloseHandle(hCom); hCom = INVALID_HANDLE_VALUE; } #endif read_port = write_port = 0; ClosePort(); } int PortInterface::GetSerBasePort(int no) { if (no >= 1 && no <= MAX_COMPORTS) { if (ser_ports[no - 1].base == 0) { DetectPorts(); } return ser_ports[no - 1].base; } else { return 0; } } int PortInterface::GetParBasePort(int no) { if (no >= 1 && no <= MAX_LPTPORTS) { if (par_ports[no - 1].base == 0) { DetectPorts(); } return par_ports[no - 1].base; } else { return 0; } } #ifdef Q_OS_WIN32 #include // #define TRUE 1 // #define FALSE 0 static int winSystemVersion() { #if 0 if ((long)GetVersion() >= 0) { return 2; } #else OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi))) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx((OSVERSIONINFO *)&osvi)) { return 0; } } qDebug() << "PlatformId: " << osvi.dwPlatformId << ", Major: " << osvi.dwMajorVersion << ", Minor: " << osvi.dwMinorVersion << ", BuildNum: " << osvi.dwBuildNumber; switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: return 2; //WINNT break; case VER_PLATFORM_WIN32_WINDOWS: return 1; //WIN9X break; } #endif return 0; } #endif //--------------------------------------------------------------------------- // DetectPorts() //--------------------------------------------------------------------------- void PortInterface::DetectPorts() { E2Profile::GetCOMAddress(ser_ports[0].base, ser_ports[1].base, ser_ports[2].base, ser_ports[3].base); E2Profile::GetLPTAddress(par_ports[0].base, par_ports[1].base, par_ports[2].base); #ifdef Q_OS_WIN32 if (E2Profile::GetAutoDetectPorts()) { LPTCount = 0; // No printer ports counted COMCount = 0; // No serial ports counted // Detect the LPT and COM ports available // Are we running Windows NT? // Detect the printer ports available if (winSystemVersion() == 2) { // Win2K / NT version DetectLPTPortsNT(); DetectCOMPortsNT(); } else { // Win9x version qCritical() << "Can't auto-detect ports on this Window version"; } } else { LPTCount = 3; COMCount = 4; } hCom = INVALID_HANDLE_VALUE; #endif E2Profile::SetCOMAddress(ser_ports[0].base, ser_ports[1].base, ser_ports[2].base, ser_ports[3].base); E2Profile::SetLPTAddress(par_ports[0].base, par_ports[1].base, par_ports[2].base); } #ifdef Q_OS_WIN32 static int DetectPortsNT(const QString &ServiceName, const QString &PortFormat, base_len *ports, int nports); //--------------------------------------------------------------------------- // DetectPorts() Win2K / NT version //--------------------------------------------------------------------------- void PortInterface::DetectLPTPortsNT() { LPTCount = DetectPortsNT("Parport", "LPT%d", par_ports, MAX_LPTPORTS); } void PortInterface::DetectCOMPortsNT() { COMCount = DetectPortsNT("Serial", "COM%d", ser_ports, MAX_COMPORTS); } // Static member function // See the two possible usage examples above! static int DetectPortsNT(const QString &ServiceName, const QString &PortFormat, base_len *ports, int nports) { LONG retval; // This revised code keeps some registry keys open, rather than collecting intermediate strings. // No silly key enumeration at all! const REGSAM KEY_PERMISSIONS = KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE; //char buf[MAX_PATH]; // handy stack-allocated multi-purpose buffer QString buf; int Count = 0; // return value (can be greater than nports) QString fname; QFileInfo fi(E2Profile::GetConfigFile()); if (fi.exists()) { fname = fi.canonicalPath(); } else { fname = qApp->applicationDirPath(); } fname.append("/detect_ports_NT.log"); QFile fh(fname); if (!fh.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { return -1; } QTextStream out(&fh); out << "Enter DetectPortsNT(" << ServiceName << ", " << PortFormat << ", " << (hex) << ports << (dec) << ", " << nports << ")\n"; if (ports != 0) { memset(ports, 0, nports * sizeof(base_len)); // Clear port array } HKEY hCCS; // Open the registry (first stage) retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet", 0, KEY_PERMISSIONS, &hCCS); if (retval == ERROR_SUCCESS) { HKEY hSvcEnum; buf = "Services\\" + ServiceName + "\\Enum"; //_snprintf(buf, sizeof(buf), L"Services\\%s\\Enum", ServiceName); retval = RegOpenKeyEx(hCCS, (LPCWSTR)buf.utf16(), 0, KEY_PERMISSIONS, &hSvcEnum); if (retval == ERROR_SUCCESS) { DWORD Length = sizeof(Count); // Count gets the number of ports in the system retval = RegQueryValueEx(hSvcEnum, L"Count", NULL, NULL, (PBYTE)&Count, &Length); if (retval == ERROR_SUCCESS) { out << "Port count: " << Count << ")\n"; for (int i = 0; i < Count; i++) { buf = QString::number(i); //_snprintf(buf, sizeof(buf), "%d", i); // A simple number uint16_t PnpPath[MAX_PATH]; // Another buffer (small changes in code would avoid even this) DWORD lptyp; Length = sizeof(PnpPath); retval = RegQueryValueEx(hSvcEnum, (LPCWSTR)buf.utf16(), NULL, &lptyp, (LPBYTE)PnpPath, &Length); if (retval == ERROR_SUCCESS) { HKEY hParams; QString strPnpPath = QString::fromUtf16(PnpPath); Q_ASSERT(lptyp == REG_SZ); out << "Cycle: " << i << ", PNPPath: " << strPnpPath << " "; //_snprintf(buf, sizeof(buf), "Enum\\%s\\Device Parameters", PnpPath); buf = "Enum\\" + strPnpPath + "\\Device Parameters"; retval = RegOpenKeyEx(hCCS, (LPCWSTR)buf.utf16(), 0, KEY_PERMISSIONS, &hParams); if (retval == ERROR_SUCCESS) { int Index; uint16_t buf2[MAX_PATH]; Length = sizeof(buf2); retval = RegQueryValueEx(hParams, L"PortName", NULL, &lptyp, (LPBYTE)buf2, &Length); if (retval == ERROR_SUCCESS) { Q_ASSERT(lptyp == REG_SZ); QString strbuf2 = QString::fromUtf16(buf2); if (sscanf(strbuf2.toLatin1().constData(), PortFormat.toLatin1().constData(), &Index) == 1 && (unsigned)--Index < (unsigned)nports) // Use zero-based index from here, avoid negative values { HKEY hControl; //_snprintf(buf, sizeof(buf), "Enum\\%s\\Control", PnpPath); buf = "Enum\\" + strPnpPath + "\\Control"; retval = RegOpenKeyEx(hCCS, (LPCWSTR)buf.utf16(), 0, KEY_PERMISSIONS, &hControl); if (retval == ERROR_SUCCESS) { Length = sizeof(buf2); retval = RegQueryValueEx(hControl, L"AllocConfig", NULL, &lptyp, (LPBYTE)buf2, &Length); if (retval == ERROR_SUCCESS) { // This undocumented AllocConfig structure is checked against Win2k and Win8/64. // In both cases, the ResType entry was at byte offset 16. DWORD *p = (DWORD *)buf2 + 4; if ((p[0] == 2 || p[0] == 3 || p[0] == 4 || p[0] == 5) // have ResType_IO && !HIWORD(p[2]) && p[2] > 0x100 // port address less than 64K and more than 0x100 && !p[3] // no high DWORD part && p[4] >= 8 && p[4] < 16) // length limited to 16 { out << strbuf2 << (dec) << " [0]=" << p[0] << ", [1]=" << p[1] << ", [2]=" << (hex) << p[2] << "h, [3]=" << p[3] << "h, [4]=" << (dec) << p[4] << "\n"; if (ports != 0) { ports[Index].base = p[2]; // We got one ports[Index].len = p[4]; // (NO check for typical ISA addresses anymore!!) } } } else { out << "RegQueryValueEx(AllocConfig) Failed with code " << retval << "\n"; } RegCloseKey(hControl); } else { out << "RegOpenKeyEx(" << buf << ") Failed with code " << retval << "\n"; } } RegCloseKey(hParams); } } else { out << "RegOpenKeyEx(" << buf << ") Failed with code " << retval << "\n"; } } } //for } else { out << "RegQueryValueEx(Count) Failed with code " << retval << "\n"; } RegCloseKey(hSvcEnum); } else { out << "RegOpenKeyEx(" << buf << ") Failed with code " << retval << "\n"; } RegCloseKey(hCCS); } else { out << "RegOpenKeyEx(HKEY_LOCAL_MACHINE, SYSTEM\\CurrentControlSet) Failed with code " << retval << "\n"; } out << "Enter DetectPortsNT() *** Count = " << Count << "\n"; fh.close(); return (Count < nports) ? Count : nports; } #endif tmp9balx013/SrcPony/filebuf.h0000644000175000017500000000724113616566001016114 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _FILEBUF_H #define _FILEBUF_H #include #include // #include #include "types.h" #include "globals.h" class e2AppWinInfo; class FileBuf { public: FileBuf(e2AppWinInfo *wininfo = 0); virtual ~FileBuf(); void SetAWInfo(e2AppWinInfo *wininfo); void SetFileName(const QString &name); //ok QString GetFileName(); //ok virtual int Load(int loadtype = ALL_TYPE, long relocation_offset = 0) = 0; virtual int Save(int savetype = ALL_TYPE, long relocation_offset = 0) = 0; FileType GetFileType() const { return file_type; } // void SetBlockSize(int blksize) // { awi->SetBlockSize(blksize); } int GetBlockSize() const; int GetNoOfBlock() const; void SetNoOfBlock(int no_blk); long GetEEpromType() const; int GetEEpromPriType() const; int GetEEpromSubType() const; void SetEEpromType(int pritype, int subtype); void SetEEpromType(unsigned long id); QString GetStringID(); void SetStringID(const QString &s); QString GetComment(); void SetComment(const QString &s); int GetRollOver() const; void SetRollOver(int rlv); long GetSplitted() const; void SetSplitted(long spl); uint32_t GetLockBits() const; void SetLockBits(uint32_t bits); uint32_t GetFuseBits() const; void SetFuseBits(uint32_t bits); // uint16_t GetCRC() const // { return awi->GetCRC(); } void SetCRC(uint16_t c); protected: uint8_t *GetBufPtr() const; long GetBufSize() const; e2AppWinInfo *GetAWInfo(); long GetFileSize(QFile &fh); FileType file_type; //Identificativo del tipo di file (E2P, INTEL, ...) // Informazioni addizionali sull'eeprom che vengono salvate nel file private: e2AppWinInfo *awi; //puntatore alla AppWinInfo che contiene questo FileBuffer }; #endif tmp9balx013/SrcPony/lptinterf.cpp0000644000175000017500000002063113616566001017040 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "errcode.h" #include "e2profil.h" #include #include #ifdef Q_OS_WIN32 #include #endif #ifdef Q_OS_LINUX //If you use latest kernel (2.4.xx) you should use standard ppdev.o module and include ppdev.h //otherwise install the ppuser module, and include the file ppuser.h #define USE_K2_4_PPDEV 1 #include #include #include #include #if USE_K2_4_PPDEV == 1 # include "linux/ppdev.h" #define PARPORTDEVNAME "/dev/parport%d" //N.B. be sure to issue a "chmod 666 /dev/parport?" #else # include "ppuser.h" #define PARPORTDEVNAME "/dev/ppuser%d0" //N.B. be sure to issue a "chmod 666 /dev/ppuser?" #endif #endif #include "globals.h" #include "lptinterf.h" #define MAX_LPTPORTS 3 LPTInterface::LPTInterface() { qDebug() << "LPTInterface::LPTInterface()"; last_ctrl = last_data = 0; lpt_control.LPPort = -1; //no used port #ifdef Q_OS_LINUX hLpt = INVALID_HANDLE_VALUE; #endif } LPTInterface::~LPTInterface() { qDebug() << "LPTInterface::~LPTInterface()"; Close(); } void LPTInterface::Close() { #ifdef Q_OS_LINUX qDebug() << "LPTInterface::Close() I ** hLpt = " << hLpt; if (hLpt != INVALID_HANDLE_VALUE) { ioctl(hLpt, PPRELEASE, 0); close(hLpt); hLpt = INVALID_HANDLE_VALUE; lpt_control.LPPort = 0; } qDebug() << "LPTInterface::Close() O ** hLpt = " << hLpt; #endif } void LPTInterface::SetPort(int port_no) { qDebug() << "LPTInterface::SetPort(" << port_no << ")"; if (port_no >= 0 && port_no < MAX_LPTPORTS) { lpt_control.LPPort = port_no; #ifdef Q_OS_LINUX if (hLpt != INVALID_HANDLE_VALUE) { ioctl(hLpt, PPRELEASE, 0); close(hLpt); } QString name = E2Profile::GetLPTDevName() + QString::number(lpt_control.LPPort); //sprintf(name, PARPORTDEVNAME, lpt_control.LPPort - 1); hLpt = open(name.toLatin1().constData(), O_RDWR); if (hLpt != INVALID_HANDLE_VALUE) { if (ioctl(hLpt, PPCLAIM, 0)) { close(hLpt); hLpt = INVALID_HANDLE_VALUE; } } qDebug() << "LPTInterface::SetPort() ** hLpt = " << hLpt; #endif } } // Bit Bit // 0 - Unused 4 - Pin 13 // 1 - Unused 5 - Pin 12 // 2 - Unused 6 - Pin 10 // 3 - Pin 15 7 - Pin 11 (Inverted) // ///////////////////////////////////////////////////////////////// int LPTInterface::InDataPort(int port_no) { qDebug() << "LPTInterface::InDataPort(" << port_no << ") ** lp=" << lpt_control.LPPort; int ret_val = E2ERR_NOTINSTALLED; #ifdef Q_OS_LINUX if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_control.LPPort) { lpt_control.LPPort = port_no; if (hLpt != INVALID_HANDLE_VALUE) { ioctl(hLpt, PPRELEASE, 0); close(hLpt); } QString name = E2Profile::GetLPTDevName() + QString::number(lpt_control.LPPort); qDebug() << "Open " << name; //sprintf(name, PARPORTDEVNAME, lpt_control.LPPort - 1); hLpt = open(name.toLatin1().constData(), O_RDWR); if (hLpt != INVALID_HANDLE_VALUE) { if (ioctl(hLpt, PPCLAIM, 0)) { close(hLpt); hLpt = INVALID_HANDLE_VALUE; } } qDebug() << "LPTInterface::InDataPort() ** hLpt=" << hLpt << ", " << name; } if (hLpt != INVALID_HANDLE_VALUE) { if (ioctl(hLpt, PPRSTATUS, &lpt_control.LPByte)) { ret_val = E2ERR_ACCESSDENIED; } else { ret_val = lpt_control.LPByte; } } #endif qDebug() << "LPTInterface::InDataPort() = " << ret_val << " (" << lpt_control.LPByte << ")"; return ret_val; } // // Bit Bit // 0 - Pin 2 4 - Pin 6 // 1 - Pin 3 5 - Pin 7 // 2 - Pin 4 6 - Pin 8 // 3 - Pin 5 7 - Pin 9 // ///////////////////////////////////////////////////////////////// int LPTInterface::OutDataPort(int val, int port_no) { qDebug() << "LPTInterface::OutDataPort(" << val << ", " << port_no << ")"; int ret_val = E2ERR_NOTINSTALLED; #ifdef Q_OS_LINUX if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_control.LPPort) { lpt_control.LPPort = port_no; if (hLpt != INVALID_HANDLE_VALUE) { ioctl(hLpt, PPRELEASE, 0); close(hLpt); } QString name = E2Profile::GetLPTDevName() + QString::number(lpt_control.LPPort); //sprintf(name, PARPORTDEVNAME, lpt_control.LPPort - 1); hLpt = open(name.toLatin1().constData(), O_RDWR); if (hLpt != INVALID_HANDLE_VALUE) { if (ioctl(hLpt, PPCLAIM, 0)) { close(hLpt); hLpt = INVALID_HANDLE_VALUE; } } } if (hLpt != INVALID_HANDLE_VALUE) { lpt_control.LPByte = last_data = (uint8_t)val; if (ioctl(hLpt, PPWDATA, &lpt_control.LPByte)) { ret_val = E2ERR_ACCESSDENIED; } else { ret_val = OK; } } #endif qDebug() << "LPTInterface::OutDataPort() = " << ret_val; return ret_val; } // // Bit // 0 - Pin 1 // 1 - Pin 14 // 2 - Pin 16 // 3 - Pin 17 NOTE: Bits 5-7 are not used. // ///////////////////////////////////////////////////////////////// int LPTInterface::OutControlPort(int val, int port_no) { qDebug() << "LPTInterface::OutControlPort(" << val << ", " << port_no << ")"; int ret_val = E2ERR_NOTINSTALLED; #ifdef Q_OS_LINUX if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_control.LPPort) { lpt_control.LPPort = port_no; if (hLpt != INVALID_HANDLE_VALUE) { ioctl(hLpt, PPRELEASE, 0); close(hLpt); } QString name = E2Profile::GetLPTDevName() + QString::number(lpt_control.LPPort); //sprintf(name, PARPORTDEVNAME, lpt_control.LPPort - 1); hLpt = open(name.toLatin1().constData(), O_RDWR); if (hLpt != INVALID_HANDLE_VALUE) { if (ioctl(hLpt, PPCLAIM, 0)) { close(hLpt); hLpt = INVALID_HANDLE_VALUE; } } } if (hLpt != INVALID_HANDLE_VALUE) { lpt_control.LPByte = last_ctrl = (uint8_t)val & 0x0F; if (ioctl(hLpt, PPWCONTROL, &lpt_control.LPByte)) { ret_val = E2ERR_ACCESSDENIED; } else { ret_val = OK; } } #endif qDebug() << "LPTInterface::OutControlPort() = " << ret_val; return ret_val; } int LPTInterface::OutDataMask(int mask, int val) { int ret_val = E2ERR_NOTINSTALLED; #ifdef Q_OS_LINUX if (hLpt != INVALID_HANDLE_VALUE) { if (val == 0) { last_data &= ~mask; } else if (val == 1) { last_data |= mask; } else { last_data ^= mask; } ret_val = OutDataPort(last_data); } #endif return ret_val; } int LPTInterface::OutControlMask(int mask, int val) { int ret_val = E2ERR_NOTINSTALLED; #ifdef Q_OS_LINUX if (hLpt != INVALID_HANDLE_VALUE) { if (val == 0) { last_ctrl &= ~mask; } else if (val == 1) { last_ctrl |= mask; } else { last_ctrl ^= mask; } ret_val = OutControlPort(last_ctrl); } #endif return ret_val; } tmp9balx013/SrcPony/binfbuf.cpp0000644000175000017500000001024413616566001016443 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include "types.h" #include "binfbuf.h" // Header file #include "errcode.h" binFileBuf::binFileBuf(e2AppWinInfo *wininfo) : FileBuf(wininfo) { file_type = BIN; } binFileBuf::~binFileBuf() { } #include "crc.h" int binFileBuf::Load(int loadtype, long relocation_offset) { QFile fh(GetFileName()); int rval = OK; if (!fh.open(QIODevice::ReadOnly)) { return FILENOTFOUND; } long fsize = GetFileSize(fh); //rewind(fh); long buf_size = GetBufSize(); uint8_t *ptr = GetBufPtr(); if (loadtype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < buf_size) { ptr += GetSplitted(); buf_size -= GetSplitted(); } else { fh.close(); return 0; } } else if (loadtype == PROG_TYPE) { if (GetSplitted() > 0 && GetSplitted() <= buf_size) { buf_size = GetSplitted(); } else { fh.close(); return 0; } } if (relocation_offset >= buf_size) { return BADPARAM; } else { ptr += relocation_offset; buf_size -= relocation_offset; } if (fsize > buf_size) { fsize = buf_size; } QDataStream datastream(&fh); rval = datastream.readRawData((char *)ptr, fsize); fh.close(); // SetStringID(""); //???? SetComment(""); SetRollOver(0); //2 (che significa NO) ?? SetCRC(mcalc_crc(GetBufPtr(), GetBlockSize() * GetNoOfBlock())); // rval = GetNoOfBlock(); return rval; } int binFileBuf::Save(int savetype, long relocation_offset) { QFile fh(FileBuf::GetFileName()); int rval; if (FileBuf::GetNoOfBlock() <= 0) { return NOTHINGTOSAVE; } if (!fh.open(QIODevice::WriteOnly)) { return CREATEERROR; } long buf_size = FileBuf::GetBlockSize() * FileBuf::GetNoOfBlock(); uint8_t *ptr = FileBuf::GetBufPtr(); if (savetype == PROG_TYPE) { if (GetSplitted() > 0 && GetSplitted() <= buf_size) { buf_size = GetSplitted(); } else { fh.close(); return 0; } } else if (savetype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < buf_size) { ptr += GetSplitted(); buf_size -= GetSplitted(); } else { fh.close(); return 0; } } QDataStream datastream(&fh); rval = datastream.writeRawData((const char *) ptr, buf_size); if (rval == 0) { rval = WRITEERROR; } fh.close(); return rval; } tmp9balx013/SrcPony/microbus.cpp0000644000175000017500000001160213616566001016652 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "globals.h" #include "e2profil.h" #include "microbus.h" #include "errcode.h" #include "e2cmdw.h" #include #include MicroWireBus::MicroWireBus(BusInterface *ptr) : BusIO(ptr) { qDebug() << Q_FUNC_INFO; } MicroWireBus::~MicroWireBus() { qDebug() << Q_FUNC_INFO; } void MicroWireBus::SetDelay() { int val = E2Profile::GetMicroWireSpeed(); int n; switch (val) { case TURBO: n = 1; // as fast as your PC can break; case FAST: n = 5; break; case SLOW: n = 50; break; case VERYSLOW: n = 200; break; case ULTRASLOW: n = 800; break; default: n = 10; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } int MicroWireBus::SendDataBit(int b) { //clearCLK(); //si assicura che SCK low //bitDI(b); //ShotDelay(); //setCLK(); //device latch data bit now! //ShotDelay(); //clearCLK(); int err = OK; busI->xferBit(err, b, SPI_MODE_0 | xMODE_WRONLY); return err; } int MicroWireBus::RecDataBit() { //clearCLK(); //si assicura che SCK low //ShotDelay(); //setCLK(); //ShotDelay(); //b = getDO(); //clearCLK(); int err = OK; int rv = busI->xferBit(err, 1, SPI_MODE_1 | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int MicroWireBus::RecDataBitShort() { clearCLK(); //be sure SCK low ShotDelay(); return getDO(); } int MicroWireBus::SendDataWord(int wo, int wlen, bool lsb) { int err = OK; clearCLK(); busI->xferWord(err, wo, SPI_MODE_0 | xMODE_WRONLY, wlen, lsb); clearDI(); return err; } //Standard Receive data word int MicroWireBus::RecDataWord(int wlen, bool lsb) { int err = OK; clearCLK(); int rv = busI->xferWord(err, 0xffff, SPI_MODE_1 | xMODE_RDONLY, wlen, lsb); if (err == OK) { return rv; } else { return err; } } //Receive Data word with the first clock pulse shortened. // In case of the device doesn't leave a clock pulse to switch // from DataOut to DataIn after the command int MicroWireBus::RecDataWordShort(int wlen, bool lsb) { int valb = 0, valw = 0; Q_ASSERT(wlen > 1); clearCLK(); valb = RecDataBitShort() ? 1 : 0; valw = RecDataWord(wlen - 1, lsb); if (lsb) { return (valw << 1) | valb; } else { return (valb << (wlen - 1)) | valw; } } int MicroWireBus::WaitReadyAfterWrite(long timeout) { clearCLK(); ClearReset(); //27/05/98 ShotDelay(); SetReset(); //27/05/98 ShotDelay(); clearCLK(); long k; for (k = timeout; k > 0 && !getDO(); k--) { WaitUsec(1); } qDebug() << Q_FUNC_INFO << "=" << k; return k ? OK : E2P_TIMEOUT; } int MicroWireBus::Reset(void) { qDebug() << Q_FUNC_INFO; SetDelay(); clearCLK(); //clearDI(); //27/05/98 setDI(); ClearReset(); //Pulse the reset WaitMsec(1); //27/05/98 SetReset(); WaitMsec(50); return OK; } int MicroWireBus::CalcAddressSize(int mem_size) const { if (mem_size-- <= 0) { return -1; } int k; for (k = 15; k > 0; k--) { if (mem_size & (1 << k)) { break; } } return k + 1; } tmp9balx013/SrcPony/picbus.cpp0000644000175000017500000002520613616566001016321 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "picbus.h" #include "errcode.h" #include #include #include "globals.h" #include "e2profil.h" #include "e2cmdw.h" class e2CmdWindow; PicBus::PicBus(BusInterface *ptr) : BusIO(ptr), DataMask(0xff), ProgMask(0x3fff), ReadProgCode(0x04), //Read Data from Program Memory LoadProgCode(0x02), //Load Data for Program Memory ReadDataCode(0x05), //Read Data from Data Memory LoadDataCode(0x03), //Load Data for Data Memory LoadConfigCode(0x00), //Load Configuration IncAddressCode(0x06), //Increment Address EraseProgMem(0x09), //Bulk Erase Program Memory EraseDataMem(0x0b), //Bulk Erase Data Memory BeginEraseProgCode(0x08), //Begin Erase Programming Cycle BeginProgOnlyCode(0x18) //Begin Programming Only Cycle { } void PicBus::SetDelay() { int val = E2Profile::GetPICSpeed(); int n; switch (val) { case TURBO: n = 1; break; case FAST: n = 2; break; case SLOW: n = 20; break; case VERYSLOW: n = 150; break; case ULTRASLOW: n = 1000; break; default: n = 6; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } int PicBus::SendDataBit(int b) { //setCLK(); //set SCK high //bitDI(b); //ShotDelay(); //clearCLK(); //device latch data bit now! //ShotDelay(); int err = OK; clearCLK(); busI->xferBit(err, b, SPI_MODE_1 | xMODE_WRONLY); return err; } // returns a negative number in case of error, 0 or 1 otherwise int PicBus::RecDataBit() { //setCLK(); //set SCK high (Pic output data now) //ShotDelay(); //b = getDO(); // sampling data on falling edge //clearCLK(); //ShotDelay(); int err = OK; clearCLK(); int rv = busI->xferBit(err, 1, SPI_MODE_1 | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int PicBus::SendDataWord(long wo, int wlen) { int err = OK; clearCLK(); clearDI(); WaitUsec(busI->GetCmd2CmdDelay()); busI->xferWord(err, wo, SPI_MODE_1 | xMODE_WRONLY, wlen, true); setDI(); //1 usec from a command to the next //WaitUsec(shot_delay/4+1); return err; } long PicBus::RecDataWord(int wlen) { int err = OK; clearCLK(); clearDI(); WaitUsec(busI->GetCmd2CmdDelay()); setDI(); ShotDelay(); int rv = busI->xferWord(err, 0xffff, SPI_MODE_1 | xMODE_RDONLY, wlen, true); //WaitUsec(shot_delay/4+1); if (err == OK) { return rv; } else { return err; } } int PicBus::SendCmdCode(int opcode) { return SendDataWord(opcode, 6); } int PicBus::SendProgCode(uint16_t data) { //the code is 14 bit data with leading and trailing 0's data &= ProgMask; data <<= 1; return SendDataWord(data); } uint16_t PicBus::RecvProgCode() { return (uint16_t)(RecDataWord() >> 1) & ProgMask; } int PicBus::SendDataCode(uint16_t data) { //the code is 8 bit data with leading and trailing 0's data &= DataMask; data <<= 1; return SendDataWord(data); } uint16_t PicBus::RecvDataCode() { return (uint16_t)(RecDataWord() >> 1) & DataMask; } int PicBus::WaitReadyAfterWrite(long timeout) { WaitMsec(10); return OK; } int PicBus::Reset(void) { SetDelay(); SetMCLR(); //First bogus entry to charge capacitors WaitMsec(150); clearDI(); ClearMCLR(); //Now reset the micro setCLK(); //keep Vdd on WaitUsec(1000); clearCLK(); //Prepare for Program mode entry WaitUsec(1000); SetMCLR(); //Program mode entry WaitMsec(10); return OK; } void PicBus::DisableCodeProtect() { SendCmdCode(LoadConfigCode); SendProgCode(0xffff); //go to location 0x2007 int k; for (k = 0; k < 7; k++) { SendCmdCode(IncAddressCode); } SendCmdCode(0x01); SendCmdCode(0x07); SendCmdCode(BeginEraseProgCode); WaitMsec(20); SendCmdCode(0x01); SendCmdCode(0x07); WaitMsec(10); Reset(); } long PicBus::ReadConfig(uint16_t *data) { Q_CHECK_PTR(data); if (data == 0) //read only configuration word { return BADPARAM; } SendCmdCode(LoadConfigCode); SendProgCode(0xffff); int k; for (k = 0; k < 8; k++, data++) { uint8_t *bp = (uint8_t *)data; uint16_t val; SendCmdCode(ReadProgCode); val = RecvProgCode(); if (val == ProgMask) { val = 0xffff; } #ifdef _BIG_ENDIAN_ *bp++ = (uint8_t)(val >> 8); *bp++ = (uint8_t)(val & 0xFF); #else *bp++ = (uint8_t)(val & 0xFF); *bp++ = (uint8_t)(val >> 8); #endif SendCmdCode(IncAddressCode); } Reset(); return OK; } long PicBus::WriteConfig(uint16_t *data) { Q_CHECK_PTR(data); if (data == 0) { return BADPARAM; } SendCmdCode(LoadConfigCode); SendProgCode(data[7]); //Other PIC programmers do this int k; for (k = 0; k < 8; k++, data++) { if (*data != 0xffff) { uint8_t *bp = (uint8_t *)data; uint16_t val; //Write Data code SendCmdCode(LoadProgCode); #ifdef _BIG_ENDIAN_ val = (uint16_t)(*bp++) << 8; val |= (uint16_t)(*bp++); #else val = (uint16_t)(*bp++); val |= (uint16_t)(*bp++) << 8; #endif SendProgCode(val); SendCmdCode(BeginEraseProgCode); if (WaitReadyAfterWrite()) { break; } //Verify while programming (10/11/99) SendCmdCode(ReadProgCode); if (CompareSingleWord(val, RecvProgCode(), ProgMask)) { return E2ERR_WRITEFAILED; } } SendCmdCode(IncAddressCode); } WaitMsec(20); Reset(); return OK; } int PicBus::Erase(int type) { if (type == ALL_TYPE) { DisableCodeProtect(); } if (type & PROG_TYPE) { SendCmdCode(LoadProgCode); SendProgCode(0xffff); SendCmdCode(EraseProgMem); SendCmdCode(BeginEraseProgCode); WaitMsec(40); Reset(); } if (type & DATA_TYPE) { SendCmdCode(LoadDataCode); SendDataCode(0xffff); SendCmdCode(EraseDataMem); SendCmdCode(BeginEraseProgCode); WaitMsec(40); Reset(); } return OK; } long PicBus::Read(int addr, uint8_t *data, long length, int page_size) { long len; ReadStart(); //Data is 8 bit, while Program is 14 bit (i.e. 16 bit) if (addr == 0) { length >>= 1; } for (len = 0; len < length; len++) { //Send command opcode if (addr) { //Read DataCode SendCmdCode(ReadDataCode); *data++ = (uint8_t)RecvDataCode(); SendCmdCode(IncAddressCode); } else { //Read Program Code SendCmdCode(ReadProgCode); uint16_t val = RecvProgCode(); if (val == ProgMask) { val = 0xffff; } #ifdef _BIG_ENDIAN_ *data++ = (uint8_t)(val >> 8); *data++ = (uint8_t)(val & 0xFF); #else *data++ = (uint8_t)(val & 0xFF); *data++ = (uint8_t)(val >> 8); #endif SendCmdCode(IncAddressCode); } if (ReadProgress(len * 100 / length)) { break; } } WaitMsec(1); //Flush ReadEnd(); if (addr == 0) { len <<= 1; } return len; } long PicBus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); if (addr == 0) { length >>= 1; } for (len = 0; len < length; len++) { uint16_t val; //Send command opcode if (addr) { //Write Data code SendCmdCode(LoadDataCode); val = (uint16_t)(*data++); SendDataCode(val); SendCmdCode(BeginEraseProgCode); if (WaitReadyAfterWrite()) { break; } //Verify while programming (10/11/99) // SendCmdCode(ReadDataCode); // if ( CompareSingleWord(val, RecvDataCode(), DataMask) ) // break; SendCmdCode(IncAddressCode); } else { //Write Program code SendCmdCode(LoadProgCode); #ifdef _BIG_ENDIAN_ val = (uint16_t)(*data++) << 8; val |= (uint16_t)(*data++); #else val = (uint16_t)(*data++); val |= (uint16_t)(*data++) << 8; #endif SendProgCode(val); SendCmdCode(BeginEraseProgCode); if (WaitReadyAfterWrite()) { break; } //Verify while programming (10/11/99) // SendCmdCode(ReadProgCode); // if ( CompareSingleWord(val, RecvProgCode(), ProgMask) ) // break; SendCmdCode(IncAddressCode); } if (WriteProgress(len * 100 / length)) { break; } } WaitMsec(1); //Flush WriteEnd(); if (addr == 0) { len <<= 1; } return len; } int PicBus::CompareSingleWord(uint16_t data1, uint16_t data2, uint16_t mask) { return (data1 & mask) != (data2 & mask); } int PicBus::CompareMultiWord(uint8_t *data1, uint8_t *data2, long length, int split) { int retval = 0; if (data1 == 0 || data2 == 0 || (length & 1) != 0) { return BADPARAM; } if (!split) { long k; for (k = 0; k < length; k += 2) { uint16_t val1, val2; #ifdef _BIG_ENDIAN_ val1 = (uint16_t)(*data1++) << 8; val1 |= (uint16_t)(*data1++); val2 = (uint16_t)(*data2++) << 8; val2 |= (uint16_t)(*data2++); #else val1 = (uint16_t)(*data1++); val1 |= (uint16_t)(*data1++) << 8; val2 = (uint16_t)(*data2++); val2 |= (uint16_t)(*data2++) << 8; #endif if ((retval = CompareSingleWord(val1, val2, ProgMask))) { break; //Stop if a difference is detected } } } else { retval = memcmp(data1, data2, length); } return retval; } tmp9balx013/SrcPony/e24xx.h0000644000175000017500000000633013616566001015450 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E24XX_H #define _E24XX_H #include "types.h" #include "device.h" #include "i2cbus.h" class e2AppWinInfo; class E24xx : public Device { public: E24xx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0, int max_no_of_bank = 8, int def_banksize = 256); virtual ~E24xx(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); int BankRollOverDetect(int force); int const max_bank; // max number of banks (max eeprom size) protected: int const timeout_loop; //eeprom timeout //!!! 07/03/98 int base_addr; //eeprom I2C base address int n_bank; //numero indirizzi (o banchi reali) int eeprom_addr[128]; // indirizzi I2C a cui risponde la EEPROM I2CBus *GetBus() { return static_cast(Device::GetBus()); } virtual int bank_out(uint8_t const *copy_buf, int bank_no, long size = -1, long idx = 0); virtual int bank_in(uint8_t *copy_buf, int bank_no, long size = -1, long idx = 0); //-- Parte riguardante la EEPROM int sequential_read; //1 --> legge un banco in una volta int writepage_size; //se > 1 scrive una pagina alla volta private: }; #endif tmp9balx013/SrcPony/device.h0000644000175000017500000001146213616566001015737 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _DEVICE_H #define _DEVICE_H #include #include "types.h" #include "globals.h" #include "busio.h" class e2AppWinInfo; class Device { public: Device(e2AppWinInfo *wininfo = 0, BusIO *busp = 0, int b_size = 0); virtual ~Device(); virtual int Probe(int probe_size = 0) { (void)probe_size; return OK; } virtual int Read(int probe = 1, int type = ALL_TYPE) = 0; virtual int Write(int probe = 1, int type = ALL_TYPE) = 0; virtual int Verify(int type = ALL_TYPE) = 0; virtual int Erase(int probe = 1, int type = ALL_TYPE) { (void)probe; (void)type; return GetBus()->Erase(); } virtual int BankRollOverDetect(int force) { (void)force; return 4; //4 means no need to know Bank Rollover for this device } virtual int SecurityRead(uint32_t &bits) { bits = 0; return 0; } virtual int SecurityWrite(uint32_t bits) { (void)bits; return 0; } virtual int FusesRead(uint32_t &bits) { bits = 0; return 0; } virtual int FusesWrite(uint32_t bits) { (void)bits; return 0; } virtual int HighEnduranceRead(uint32_t &block_no) { (void)block_no; return 0; } virtual int HighEnduranceWrite(uint32_t block_no) { (void)block_no; return 0; } virtual int ReadCalibration(int addr = 0); //-------- void SetAWInfo(e2AppWinInfo *wininfo); BusIO *GetBus() const { return bus; } void SetBus(BusIO *busp) { if (busp) { bus = busp; } } int GetNoOfBank() const; void SetNoOfBank(int no); int GetBankSize() const { return bank_size; } int GetAddrSize() const; virtual void DefaultBankSize() { bank_size = def_bank_size; } int GetProgPageSize(bool rnw) const; void SetProgPageSize(int pagesize, bool rnw); int GetDataPageSize(bool rnw) const; void SetDataPageSize(int pagesize, bool rnw); long GetDetectedType() const { return detected_type; } QString GetDetectedSignatureStr() const { return detected_signature; } protected: void SetBankSize(int size) { if (size > 0) { bank_size = size; } } uint8_t *GetBufPtr() const; int GetBufSize() const; void SetSplitted(int split); int GetSplitted() const; long GetSize() const { long size = GetNoOfBank() * bank_size; return size == AUTOSIZE_ID ? 0 : size; } virtual int ReadProg(); virtual int ReadData(); virtual int WriteProg(); virtual int WriteData(); virtual int VerifyProg(unsigned char *localbuf); virtual int VerifyData(unsigned char *localbuf); e2AppWinInfo *GetAWInfo() const { return awi; } long detected_type; QString detected_signature; private: e2AppWinInfo *awi; // pointer to container object BusIO *bus; // bus used by the device int bank_size; // used only with banked memory (240x) int const def_bank_size; int write_progpage_size; //some devices write whole pages instead of bytes to speed up programming int read_progpage_size; int write_datapage_size; int read_datapage_size; }; #endif tmp9balx013/SrcPony/progoption.cpp0000644000175000017500000000716113616566001017234 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "progoption.h" #include #include "e2profil.h" #include "eeptypes.h" #include "globals.h" progOptionDialog::progOptionDialog(QWidget *bw, long type, int &reload, int &reep, int &erase, int &flash, int &eeprom, int &lock, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); cmdw = static_cast(bw); chk = (QVector() << idRELOAD << idREADFLASH << idREADEEP << idBYTESWAP << idSETID << idREADOSCCAL << idERASE << idFLASH << idEEPROM << idLOCK); setTextWidgets(); int prog_opt = E2Profile::GetProgramOptions(); //Checked for (int k = 0; k < chk.count(); k++) { chk[k]->setChecked((prog_opt & (1 << k)) ? true : false); } connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); qDebug() << "progOptionDialog::progOptionDialog()"; } progOptionDialog::~progOptionDialog() { qDebug() << "progOptionDialog::~progOptionDialog()"; } void progOptionDialog::setTextWidgets() { QStringList txList = (QStringList() << translate(STR_MSGRELOAD) << translate(STR_MSGREADPROG) << translate(STR_MSGREADDATA) << translate(STR_MSGBYTESWAP) << translate(STR_MSGSERNUM) << translate(STR_READOSCCALIB) << translate(STR_MSGERASE) << translate(STR_MSGWRITEPROG) << translate(STR_MSGWRITEDATA) << translate(STR_MSGWRITESEC)); for (int i = 0; i < chk.size(); i++) { chk[i]->setText(txList.at(i)); } pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); } void progOptionDialog::onOk() { int prog_opt = 0; for (int k = 0; k < chk.count(); k++) { prog_opt |= (chk[k]->isChecked()) ? (1 << k) : 0; } E2Profile::SetProgramOptions(prog_opt); accept(); } tmp9balx013/SrcPony/crc.cpp0000644000175000017500000000655713616566001015613 0ustar carstencarsten#include #include "crc.h" /* Calcola il CRC in un file a partire da ini_ofs per un numero di bytes dato da len. Se len e` zero prosegue fino alla fine del file, il file deve essere aperto in modo da permettere la lettura (r, r+, w+) */ uint16_t fcalc_crc(QFile &fh, long ini_ofs, long len) { uint16_t crc16 = 0; char ch; long old_pos; old_pos = fh.pos(); fh.seek(ini_ofs);//, SEEK_SET); // from begin to init_ofs if (len) { for (; len && fh.read(&ch, 1) > 0; len--) { crc16 = updcrcr(crc16, ch); } } else { while (fh.read(&ch, 1) > 0) //while( (ch = getc(fh)) != EOF ) { crc16 = updcrcr(crc16, ch); } } fh.seek(old_pos);//, SEEK_SET); return crc16; } /* Calcola il CRC in una zona di memoria a partire da ini_addr per un numero di bytes dato da len */ uint16_t mcalc_crc(void *ini_addr, long len) { uint16_t crc16; uint8_t *bp = (uint8_t *)ini_addr; if (len == 0) { return 0; } for (crc16 = 0; len; len--) { crc16 = updcrcr(crc16, *bp++); } return crc16; } /////////////////////////////////////////////////////////////////// #define M16 0xA001 /* crc-16 mask */ /* tables */ static uint16_t crc16tab[256] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; /* update crc reverse */ uint16_t updcrcr(uint16_t crc, uint16_t c) { int tmp; tmp = (uint8_t)(crc ^ c); crc = (crc >> 8) ^ crc16tab[tmp]; return crc; } tmp9balx013/SrcPony/easyi2c_interf.cpp0000644000175000017500000001366513616566001017750 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "errcode.h" #include "wait.h" #include "e2cmdw.h" #include "easyi2c_interf.h" #include /* data register (0x378) * bit 0: D0 (pin 2) * bit 1: D1 (pin 3) * bit 2: D2 (pin 4) * bit 3: D3 (pin 5) * bit 4: D4 (pin 6) * bit 5: D5 (pin 7) * bit 6: D6 (pin 8) * bit 7: D7 (pin 9) */ /* control register (0x37A) * bit 0: STROBE (pin 1)- * bit 1: AUTOLF (pin 14)- * bit 2: INIT (pin 16)- * bit 3: SELECTIN (pin 17)- */ /* status register (0x379) * bit 3: ERROR (pin 15) * bit 4: SELECT (pin 13) * bit 5: POUT (pin 12) * bit 6: ACK (pin 10) * bit 7: BUSY (pin 11)- */ #define WB_SCL 0 // DATA (pin 2) #define WB_SDA 1 // DATA (pin 3) #define RB_SCL 4 // STATUS (pin 13) #define RB_SDA 5 // STATUS (pin 12) #define WF_SCL (1 << WB_SCL) #define WF_SDA (1 << WB_SDA) #define RF_SCL (1 << RB_SCL) #define RF_SDA (1 << RB_SDA) EasyI2CInterface::EasyI2CInterface(bool use_io) : LptExtInterface(use_io) { //DeInstall(); //old_portno = GetInstalled(); } int EasyI2CInterface::Open(int port_no) { int ret_val = OK; if (GetInstalled() != port_no) { if (InDataPort(port_no) < 0) { ret_val = E2ERR_OPENFAILED; } else { Install(port_no); OutDataPort(0); } } return ret_val; } void EasyI2CInterface::Close() { if (IsInstalled()) { LptExtInterface::Close(); DeInstall(); } } void EasyI2CInterface::SetDataOut(int sda) { qDebug() << "EasyI2CInterface::SetDataOut(" << sda << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & DOUTINV) != 0) { sda = !sda; } //The EasyI2C interface is inverting by default OutDataMask(WF_SDA, sda ? 0 : 1); } } void EasyI2CInterface::SetClock(int scl) { qDebug() << "EasyI2CInterface::SetClock(" << scl << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & CLOCKINV) != 0) { scl = !scl; } //The EasyI2C interface is inverting by default OutDataMask(WF_SCL, scl ? 0 : 1); } } void EasyI2CInterface::SetClockData() { qDebug() << "EasyI2CInterface::SetClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); uint8_t cpreg = GetLastData(); if (control & CLOCKINV) { cpreg |= WF_SCL; } else { cpreg &= ~WF_SCL; } if (control & DOUTINV) { cpreg |= WF_SDA; } else { cpreg &= ~WF_SDA; } OutDataPort(cpreg); } } int EasyI2CInterface::GetDataIn() { qDebug() << "EasyI2CInterface::GetDataIn() *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & DININV) { return !(InDataPort() & RF_SDA); } else { return InDataPort() & RF_SDA; } } else { return E2ERR_NOTINSTALLED; } } int EasyI2CInterface::GetClock() { qDebug() << "EasyI2CInterface::GetClock() *** Inst=" << IsInstalled(); if (IsInstalled()) { return InDataPort() & RF_SCL; } else { return E2ERR_NOTINSTALLED; } } int EasyI2CInterface::IsClockDataUP() { if (IsInstalled()) { int val = InDataPort(); int sda = val & RF_SDA; int scl = val & RF_SCL; if (cmdWin->GetPolarity() & DININV) { sda = !sda; } return (sda && scl); } else { return E2ERR_NOTINSTALLED; } } int EasyI2CInterface::IsClockDataDOWN() { if (IsInstalled()) { int val = InDataPort(); int sda = val & RF_SDA; int scl = val & RF_SCL; if (cmdWin->GetPolarity() & DININV) { sda = !sda; } return (!sda && !scl); } else { return E2ERR_NOTINSTALLED; } } int EasyI2CInterface::TestPort(int port) { qDebug() << "EasyI2CInterface::TestPort(" << port << ") IN"; int ret_val = TestSave(port); if (ret_val == OK) { SetDataOut(0); w.WaitMsec(50); if (GetDataIn()) { ret_val = E2ERR_OPENFAILED; } else { SetDataOut(1); w.WaitMsec(50); if (!GetDataIn()) { ret_val = E2ERR_OPENFAILED; } } } TestRestore(); qDebug() << "EasyI2CInterface::TestPort() = " << ret_val << " OUT"; return ret_val; } tmp9balx013/SrcPony/ponyprog.qrc0000644000175000017500000000440313616566001016710 0ustar carstencarsten icons/delete.png icons/help20x20.png icons/lock20x20.png icons/new.png icons/open_eep20x20.png icons/print.png icons/rd_eep.png icons/ver_eep.png icons/read.png icons/save20x20.png icons/icon1.png icons/ponyprog-small.png icons/ponyprog.png icons/save.png icons/wr_eep.png icons/write.png icons/chip20x20.png icons/edit20x20.png icons/help20.png icons/lock20.png icons/open_flash20x20.png icons/program20x20.png icons/rd_flash20x20.png icons/ver_flash20x20.png icons/reload20x20.png icons/save20.png icons/script20x20.png icons/wr_flash20x20.png icons/copy.png icons/erase20x20.png icons/help2.png icons/lock.png icons/open20x20.png icons/open.png icons/print20x20.png icons/rd_all20x20.png icons/ver_all20x20.png icons/read20x20.png icons/reload20.png icons/save_eep20x20.png icons/sernum20x20.png icons/wr_all20x20.png icons/write20x20.png icons/cut.png icons/find.png icons/help.png icons/new20x20.png icons/open20.png icons/paste.png icons/print20.png icons/rd_eep20x20.png icons/ver_eep20x20.png icons/read20.png icons/reload.png icons/save_flash20x20.png icons/setup20x20.png icons/wr_eep20x20.png icons/write20.png tmp9balx013/SrcPony/e2dlg.cpp0000644000175000017500000005715413616566001016040 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include #include #include "e2dlg.h" #include "e2cmdw.h" #include "eeptypes.h" #include "types.h" #include "i2cbus.h" #include "interfconv.h" class e2CmdWindow; e2Dialog::e2Dialog(QWidget *bw, const QString title) : QDialog(bw), port_no(-1), lpt_no(2), com_no(3), usb_no(0), gpio_no(0), usb_vp(0), interf_type(SIPROG_API) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } setWidgetsText(); //NB Must be called before getSettings() //connect(rdbComPort, SIGNAL(toggled(bool)), this, SLOT(onChangePort(bool))); //connect(rdbLptPort, SIGNAL(toggled(bool)), this, SLOT(onChangePort(bool))); //connect(cbxInterfCOM, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectCOM(int))); //connect(cbxInterfLPT, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectLPT(int))); //connect(cbxInterfCOMNum, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectCOMNum(int))); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(pushTest, SIGNAL(clicked(bool)), this, SLOT(onTest())); connect(&watcher, SIGNAL(notify(bool, quint16, quint16)), this, SLOT(onUSB(bool, quint16, quint16))); getSettings(); } void e2Dialog::getSettings() { E2Profile::readDialogSettings(this); interf_type = cmdWin->GetInterfaceType(); if (interf_type < SIPROG_API || interf_type >= LAST_HT) { interf_type = SIPROG_API; } port_no = cmdWin->GetPort(); if (TypeToInterfVector(interf_type) == INTERF_COM) //COM { com_no = port_no; if (com_no >= comList.count()) { com_no = 0; port_no = 0; } cbxInterfCOMNum->setCurrentIndex(com_no); cbxInterfCOM->setCurrentIndex(TypeToInterfIndex(interf_type)); if (tabWidget->currentIndex() != INTERF_COM) { tabWidget->setCurrentIndex(INTERF_COM); } else { on_tabWidget_currentChanged(INTERF_COM); } ckControlOutCOM->setChecked((cmdWin->GetPolarity() & RESETINV) ? true : false); ckClockOutCOM->setChecked((cmdWin->GetPolarity() & CLOCKINV) ? true : false); ckDataInCOM->setChecked((cmdWin->GetPolarity() & DININV) ? true : false); ckDataOutCOM->setChecked((cmdWin->GetPolarity() & DOUTINV) ? true : false); } else if (TypeToInterfVector(interf_type) == INTERF_LPT) { lpt_no = port_no; if (lpt_no >= lptList.count()) { lpt_no = 0; port_no = 0; } cbxInterfLPTNum->setCurrentIndex(lpt_no); cbxInterfLPT->setCurrentIndex(TypeToInterfIndex(interf_type)); if (tabWidget->currentIndex() != INTERF_LPT) { tabWidget->setCurrentIndex(INTERF_LPT); } else { on_tabWidget_currentChanged(INTERF_LPT); } ckControlOutLPT->setChecked((cmdWin->GetPolarity() & RESETINV) ? true : false); ckClockOutLPT->setChecked((cmdWin->GetPolarity() & CLOCKINV) ? true : false); ckDataInLPT->setChecked((cmdWin->GetPolarity() & DININV) ? true : false); ckDataOutLPT->setChecked((cmdWin->GetPolarity() & DOUTINV) ? true : false); //ckPowerOnLPT->setChecked((cmdWin->GetPolarity() & POWERINV) ? true : false); //ckEnaODLPT->setChecked((cmdWin->GetPolarity() & ENBUSINV) ? true : false); ckClockInLPT->setChecked((cmdWin->GetPolarity() & CLOCKININV) ? true : false); //ckControlInLPT->setChecked((cmdWin->GetPolarity() & CTRLININV) ? true : false); } else if (TypeToInterfVector(interf_type) == INTERF_USB) { usb_no = port_no; //usb_vp = TypeToInterfVidPid(interf_type); //watcher.hotplug_register(usb_vp.vid, usb_vp.pid); //usbList = MpsseInterface::find_all(usb_vp.vid, usb_vp.pid); cbxInterfUSB->setCurrentIndex(TypeToInterfIndex(interf_type)); cbxInterfUSBNum->setCurrentIndex(usb_no); if (tabWidget->currentIndex() != INTERF_USB) { tabWidget->setCurrentIndex(INTERF_USB); } else { on_tabWidget_currentChanged(INTERF_USB); } ckControlOutUSB->setChecked((cmdWin->GetPolarity() & RESETINV) ? true : false); ckClockOutUSB->setChecked((cmdWin->GetPolarity() & CLOCKINV) ? true : false); ckDataInUSB->setChecked((cmdWin->GetPolarity() & DININV) ? true : false); ckDataOutUSB->setChecked((cmdWin->GetPolarity() & DOUTINV) ? true : false); ckPowerOnUSB->setChecked((cmdWin->GetPolarity() & POWERINV) ? true : false); ckEnaODUSB->setChecked((cmdWin->GetPolarity() & ENBUSINV) ? true : false); ckClockInUSB->setChecked((cmdWin->GetPolarity() & CLOCKININV) ? true : false); ckControlInUSB->setChecked((cmdWin->GetPolarity() & CTRLININV) ? true : false); } else if (TypeToInterfVector(interf_type) == INTERF_GPIO) { gpio_no = port_no; if (gpio_no >= gpioList.count()) { gpio_no = 0; port_no = 0; } cbxInterfGPIONum->setCurrentIndex(gpio_no); cbxInterfGPIO->setCurrentIndex(TypeToInterfIndex(interf_type)); if (tabWidget->currentIndex() != INTERF_GPIO) { tabWidget->setCurrentIndex(INTERF_GPIO); } else { on_tabWidget_currentChanged(INTERF_GPIO); } ckControlOutGPIO->setChecked((cmdWin->GetPolarity() & RESETINV) ? true : false); ckClockOutGPIO->setChecked((cmdWin->GetPolarity() & CLOCKINV) ? true : false); ckDataInGPIO->setChecked((cmdWin->GetPolarity() & DININV) ? true : false); ckDataOutGPIO->setChecked((cmdWin->GetPolarity() & DOUTINV) ? true : false); ckPowerOnGPIO->setChecked((cmdWin->GetPolarity() & POWERINV) ? true : false); ckEnaODGPIO->setChecked((cmdWin->GetPolarity() & ENBUSINV) ? true : false); ckClockInGPIO->setChecked((cmdWin->GetPolarity() & CLOCKININV) ? true : false); ckControlInGPIO->setChecked((cmdWin->GetPolarity() & CTRLININV) ? true : false); } //TODO: A way to detect if run on RaspberryPi //if (QSysInfo::currentCpuArchitecture().startsWith("arm")) cbxInterfGPIONum->setEnabled(false); } void e2Dialog::setSettings() { E2Profile::writeDialogSettings(this); InterfPins pins = {-1, -1, -1, -1, -1, -1, -1, -1}; unsigned int pol = 0; switch (TypeToInterfVector(interf_type)) { case INTERF_COM: if (ckControlOutCOM->isChecked()) { pol |= RESETINV; } if (ckClockOutCOM->isChecked()) { pol |= CLOCKINV; } if (ckDataInCOM->isChecked()) { pol |= DININV; } if (ckDataOutCOM->isChecked()) { pol |= DOUTINV; } break; case INTERF_LPT: if (ckControlOutLPT->isChecked()) { pol |= RESETINV; } if (ckClockOutLPT->isChecked()) { pol |= CLOCKINV; } if (ckDataInLPT->isChecked()) { pol |= DININV; } if (ckDataOutLPT->isChecked()) { pol |= DOUTINV; } if (ckClockInLPT->isChecked()) { pol |= CLOCKININV; } break; case INTERF_USB: if (ckControlOutUSB->isChecked()) { pol |= RESETINV; } if (ckClockOutUSB->isChecked()) { pol |= CLOCKINV; } if (ckDataInUSB->isChecked()) { pol |= DININV; } if (ckDataOutUSB->isChecked()) { pol |= DOUTINV; } if (ckPowerOnUSB->isChecked()) { pol |= POWERINV; } if (ckEnaODUSB->isChecked()) { pol |= ENBUSINV; } if (ckClockInUSB->isChecked()) { pol |= CLOCKININV; } if (ckControlInUSB->isChecked()) { pol |= CTRLININV; } //Set pins configuration pins.clock = cbxClockOutUSB->currentIndex(); pins.ctrl = cbxControlOutUSB->currentIndex(); pins.datain = cbxDataInUSB->currentIndex(); pins.dataout = cbxDataOutUSB->currentIndex(); pins.clockin = cbxClockInUSB->currentIndex(); pins.ctrlin = cbxControlInUSB->currentIndex(); pins.enbus = cbxEnaODUSB->currentIndex(); pins.poweron = cbxPowerOnUSB->currentIndex(); E2Profile::SetInterfacePins(interf_type, pins); break; case INTERF_GPIO: if (ckControlOutGPIO->isChecked()) { pol |= RESETINV; } if (ckClockOutGPIO->isChecked()) { pol |= CLOCKINV; } if (ckDataInGPIO->isChecked()) { pol |= DININV; } if (ckDataOutGPIO->isChecked()) { pol |= DOUTINV; } if (ckPowerOnGPIO->isChecked()) { pol |= POWERINV; } if (ckEnaODGPIO->isChecked()) { pol |= ENBUSINV; } if (ckClockInGPIO->isChecked()) { pol |= CLOCKININV; } if (ckControlInGPIO->isChecked()) { pol |= CTRLININV; } pins.clock = cbxClockOutGPIO->currentIndex(); pins.ctrl = cbxControlOutGPIO->currentIndex(); pins.datain = cbxDataInGPIO->currentIndex(); pins.dataout = cbxDataOutGPIO->currentIndex(); pins.clockin = cbxClockInGPIO->currentIndex(); pins.ctrlin = cbxControlInGPIO->currentIndex(); pins.enbus = cbxEnaODGPIO->currentIndex(); pins.poweron = cbxPowerOnGPIO->currentIndex(); E2Profile::SetInterfacePins(interf_type, pins); break; } cmdWin->SetPolarity(pol); if (interf_type != cmdWin->GetInterfaceType()) { cmdWin->ClosePort(); cmdWin->SetInterfaceType(interf_type); } else { cmdWin->GetInterfPtr()->ConfigPins(pins); } cmdWin->SetPort(port_no); //Store values in the INI file E2Profile::SetParInterfType(interf_type); E2Profile::SetPortNumber(port_no); E2Profile::SetPolarityLines(cmdWin->GetPolarity()); qDebug() << "PortNo: " << port_no; } static QStringList generatePinList(int min, int max) { QStringList pinList; Q_ASSERT(min <= max); for (int k = min; k <= max; k++) { pinList << QString::number(k); } return pinList; } #define GPIO_PIN_MAX 31 //may be 27 for RaspberryPi #define USB_PIN_MAX 15 //0-7 for ADBUS, 8-15 for ACBUS void e2Dialog::setWidgetsText() { #ifndef Q_OS_LINUX //remove the tab on system different from Linux tabWidget->removeTab(INTERF_GPIO); #endif //recurseCbxHide(groupBoxUSBPol); recurseCbxHide(groupBoxCOMPol); //No pin select on legacy COM recurseCbxHide(groupBoxLPTPol); //No pin select on legacy LPT //recurseCbxHide(groupBoxGPIOPol); QStringList pinlist = generatePinList(0, GPIO_PIN_MAX); cbxClockOutGPIO->addItems(pinlist); cbxDataOutGPIO->addItems(pinlist); cbxDataInGPIO->addItems(pinlist); cbxControlOutGPIO->addItems(pinlist); cbxClockInGPIO->addItems(pinlist); cbxControlInGPIO->addItems(pinlist); cbxEnaODGPIO->addItems(pinlist); cbxPowerOnGPIO->addItems(pinlist); pinlist = generatePinList(0, USB_PIN_MAX); cbxClockOutUSB->addItems(pinlist); cbxDataOutUSB->addItems(pinlist); cbxDataInUSB->addItems(pinlist); cbxControlOutUSB->addItems(pinlist); cbxClockInUSB->addItems(pinlist); cbxControlInUSB->addItems(pinlist); cbxEnaODUSB->addItems(pinlist); cbxPowerOnUSB->addItems(pinlist); cbxInterfCOM->addItems(GetInterfList(INTERF_COM)); cbxInterfLPT->addItems(GetInterfList(INTERF_LPT)); cbxInterfUSB->addItems(GetInterfList(INTERF_USB)); cbxInterfGPIO->addItems(GetInterfList(INTERF_GPIO)); //rdbComPort->setText(translate(STR_LBLSERIAL)); //rdbLptPort->setText(translate(STR_LBLPARALLEL)); lptList = E2Profile::GetLPTDevList(); comList = E2Profile::GetCOMDevList(); usbList.clear(); gpioList = QString("0 1 2 3 4 5 6 7").split(' '); cbxInterfCOMNum->clear(); cbxInterfCOMNum->addItems(comList); //Check valid com ports interf_type = SIPROG_API; port_no = -1; for (const auto &i : comList) { qDebug() << "comList " << i; QString devname = E2Profile::GetCOMDevName(); QString s = i; if (s.startsWith(devname)) { int n = s.midRef(devname.length()).toString().toInt(); #ifdef Q_OS_WIN32 n--; #endif if (n >= 0 && Test(n, true) != OK) { //comList.removeOne(s); cbxInterfCOMNum->setItemData(n, QColor(Qt::lightGray), Qt::BackgroundRole); } } } cbxInterfLPTNum->clear(); cbxInterfLPTNum->addItems(lptList); //Check valid com ports #ifdef Q_OS_WIN32 interf_type = AVRISP_IO; #else interf_type = AVRISP; #endif port_no = -1; for (const auto &i : lptList) { qDebug() << "lptList " << i; QString devname = E2Profile::GetLPTDevName(); QString s = i; if (s.startsWith(devname)) { int n = s.midRef(devname.length()).toString().toInt(); #ifdef Q_OS_WIN32 n--; #endif if (n >= 0 && Test(n, true) != OK) { cbxInterfLPTNum->setItemData(n, QColor(Qt::lightGray), Qt::BackgroundRole); } } } cbxInterfUSBNum->clear(); cbxInterfUSBNum->addItems(usbList); cbxInterfGPIONum->clear(); cbxInterfGPIONum->addItems(gpioList); groupBoxCOMPol->setTitle(translate(STR_LBLSELPOLARITY)); groupBoxLPTPol->setTitle(translate(STR_LBLSELPOLARITY)); groupBoxUSBPol->setTitle(translate(STR_LBLSELPOLARITY)); groupBoxGPIOPol->setTitle(translate(STR_LBLSELPOLARITY)); ckControlOutCOM->setToolTip(translate(STR_LBLINVRESET)); ckControlOutLPT->setToolTip(translate(STR_LBLINVRESET)); ckControlOutUSB->setToolTip(translate(STR_LBLINVRESET)); ckControlOutGPIO->setToolTip(translate(STR_LBLINVRESET)); ckClockOutCOM->setToolTip(translate(STR_LBLINVSCK)); ckClockOutLPT->setToolTip(translate(STR_LBLINVSCK)); ckClockOutUSB->setToolTip(translate(STR_LBLINVSCK)); ckClockOutGPIO->setToolTip(translate(STR_LBLINVSCK)); ckDataInCOM->setToolTip(translate(STR_LBLINVDATAIN)); ckDataInLPT->setToolTip(translate(STR_LBLINVDATAIN)); ckDataInUSB->setToolTip(translate(STR_LBLINVDATAIN)); ckDataInGPIO->setToolTip(translate(STR_LBLINVDATAIN)); ckDataOutCOM->setToolTip(translate(STR_LBLINVDATAOUT)); ckDataOutLPT->setToolTip(translate(STR_LBLINVDATAOUT)); ckDataOutUSB->setToolTip(translate(STR_LBLINVDATAOUT)); ckDataOutGPIO->setToolTip(translate(STR_LBLINVDATAOUT)); cbxControlOutGPIO->setToolTip("Select Control-Out Pin"); cbxClockOutGPIO->setToolTip("Select Clock-Out Pin"); cbxDataOutGPIO->setToolTip("Select Data-Out Pin"); cbxDataInGPIO->setToolTip("Select Data-In Pin"); cbxControlOutUSB->setToolTip("Select Control-Out Pin"); cbxClockOutUSB->setToolTip("Select Clock-Out Pin"); cbxDataOutUSB->setToolTip("Select Data-Out Pin"); cbxDataInUSB->setToolTip("Select Data-In Pin"); //lblPol1->setText(translate(STR_LBLSELPOLARITY)); //chkPol1->setText(translate(STR_LBLINVRESET)); //chkPol2->setText(translate(STR_LBLINVSCK)); //chkPol3->setText(translate(STR_LBLINVDATAIN)); //chkPol4->setText(translate(STR_LBLINVDATAOUT)); pushOk->setText(translate(STR_BTNOK)); pushTest->setText(translate(STR_BTNPROBE)); pushCancel->setText(translate(STR_BTNCANC)); } void e2Dialog::onOk() { setSettings(); accept(); } void e2Dialog::onTest() { int test = Test(); if (test) { QString extraMsg = ""; if (test == E2ERR_IOTEST || E2ERR_NOTINSTALLED) { if (cmdWin->GetInterfaceType() == PONYPROG_FT) { extraMsg = "\n" + translate(STR_EXTRAPROBEMSG_FTPROG); } } QMessageBox msgBox(QMessageBox::Critical, "Failed", translate(STR_TEST) + " " + translate(STR_MSGFAILED) + extraMsg, QMessageBox::Ok); msgBox.setStyleSheet(cmdWin->getStyleSheet()); msgBox.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); msgBox.exec(); } else { QMessageBox msgBox(QMessageBox::Information, "Info", translate(STR_TEST) + " " + translate(STR_OK), QMessageBox::Ok); msgBox.setStyleSheet(cmdWin->getStyleSheet()); msgBox.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); msgBox.exec(); } } int e2Dialog::Test(int p, bool open_only) const { qDebug() << "e2Dialog::Test() IN *** p=" << p << ", open_only=" << open_only; HInterfaceType old_interf = cmdWin->GetInterfaceType(); int test; if (p < 0) { p = port_no; } qDebug() << "e2Dialog::Test() old_interf = " << (int)old_interf << ", interf = " << (int)interf_type; if (interf_type != old_interf) { cmdWin->SetInterfaceType(interf_type); test = cmdWin->TestPort(p, open_only); cmdWin->SetInterfaceType(old_interf); } else { test = cmdWin->TestPort(p, open_only); } qDebug() << "e2Dialog::Test() = " << test << " *** OUT"; return test; } void e2Dialog::on_tabWidget_currentChanged(int index) { if (index == INTERF_COM) { qDebug() << "COM Port selected: " << com_no; port_no = com_no; cbxInterfCOMNum->setCurrentIndex(com_no); interf_type = VindexToInterfType(INTERF_COM, cbxInterfCOM->currentIndex()); } else if (index == INTERF_LPT) { qDebug() << "LPT Port selected: " << lpt_no; port_no = lpt_no; cbxInterfLPTNum->setCurrentIndex(lpt_no); interf_type = VindexToInterfType(INTERF_LPT, cbxInterfLPT->currentIndex()); } else if (index == INTERF_USB) { qDebug() << "USB Port selected: " << usb_no; //usb_vp = TypeToInterfVidPid(interf_type); //watcher.hotplug_register(usb_vp.vid, usb_vp.pid); //usbList = MpsseInterface::find_all(usb_vp.vid, usb_vp.pid); int idx = cbxInterfUSB->currentIndex(); on_cbxInterfUSB_currentIndexChanged(idx); port_no = usb_no; cbxInterfUSBNum->setCurrentIndex(port_no); //Get pins configuration InterfPins pins = E2Profile::GetInterfacePins(interf_type); cbxClockOutUSB->setCurrentIndex(pins.clock); cbxControlOutUSB->setCurrentIndex(pins.ctrl); cbxDataInUSB->setCurrentIndex(pins.datain); cbxDataOutUSB->setCurrentIndex(pins.dataout); cbxClockInUSB->setCurrentIndex(pins.clockin); cbxControlInUSB->setCurrentIndex(pins.ctrlin); cbxEnaODUSB->setCurrentIndex(pins.enbus); cbxPowerOnUSB->setCurrentIndex(pins.poweron); } else if (index == INTERF_GPIO) { qDebug() << "GPIO Port selected: " << gpio_no; port_no = gpio_no; cbxInterfGPIONum->setCurrentIndex(gpio_no); interf_type = VindexToInterfType(INTERF_GPIO, cbxInterfGPIO->currentIndex()); //Get pins configuration InterfPins pins = E2Profile::GetInterfacePins(interf_type); cbxClockOutGPIO->setCurrentIndex(pins.clock); cbxControlOutGPIO->setCurrentIndex(pins.ctrl); cbxDataInGPIO->setCurrentIndex(pins.datain); cbxDataOutGPIO->setCurrentIndex(pins.dataout); cbxClockInGPIO->setCurrentIndex(pins.clockin); cbxControlInGPIO->setCurrentIndex(pins.ctrlin); cbxEnaODGPIO->setCurrentIndex(pins.enbus); cbxPowerOnGPIO->setCurrentIndex(pins.poweron); } } void e2Dialog::on_cbxInterfCOM_currentIndexChanged(int index) { interf_type = VindexToInterfType(INTERF_COM, index); qDebug() << "Selected IntefType: " << (int)interf_type << ", index = " << index << ", COM"; } void e2Dialog::on_cbxInterfLPT_currentIndexChanged(int index) { interf_type = VindexToInterfType(INTERF_LPT, index); qDebug() << "Selected IntefType: " << (int)interf_type << ", index = " << index << ", LPT"; } void e2Dialog::on_cbxInterfUSB_currentIndexChanged(int index) { interf_type = VindexToInterfType(INTERF_USB, index); qDebug() << "Selected IntefType: " << (int)interf_type << ", index = " << index << ", USB"; usb_vp = TypeToInterfVidPid(interf_type); watcher.hotplug_register(usb_vp.vid, usb_vp.pid); usbList = MpsseInterface::find_all(usb_vp.vid, usb_vp.pid); cbxInterfUSBNum->clear(); cbxInterfUSBNum->addItems(usbList); } void e2Dialog::on_cbxInterfGPIO_currentIndexChanged(int index) { interf_type = VindexToInterfType(INTERF_GPIO, index); qDebug() << "Selected IntefType: " << (int)interf_type << ", index = " << index << ", GPIO"; } void e2Dialog::on_cbxInterfCOMNum_currentIndexChanged(int index) { if (index >= 0) { port_no = com_no = index; qDebug() << "Selected COM port " << port_no; } } void e2Dialog::on_cbxInterfLPTNum_currentIndexChanged(int index) { if (index >= 0) { port_no = lpt_no = index; qDebug() << "Selected LPT port " << port_no; } } void e2Dialog::on_cbxInterfUSBNum_currentIndexChanged(int index) { if (index >= 0) { port_no = usb_no = index; qDebug() << Q_FUNC_INFO << "Selected USB port " << port_no; } } void e2Dialog::on_cbxInterfGPIONum_currentIndexChanged(int index) { if (index >= 0) { port_no = gpio_no = index; qDebug() << Q_FUNC_INFO << "Selected GPIO port " << port_no; } } void e2Dialog::onUSB(bool connected, quint16 vid, quint16 pid) { qDebug() << Q_FUNC_INFO << " " << connected << " " << vid << " " << pid; usbList.clear(); usbList = MpsseInterface::find_all(usb_vp.vid, usb_vp.pid); cbxInterfUSBNum->clear(); cbxInterfUSBNum->addItems(usbList); } void e2Dialog::on_pushDefaultsUSB_clicked() { ckControlOutUSB->setChecked(false); ckClockOutUSB->setChecked(false); ckDataInUSB->setChecked(false); ckDataOutUSB->setChecked(false); ckPowerOnUSB->setChecked(false); ckEnaODUSB->setChecked(false); ckClockInUSB->setChecked(false); ckControlInUSB->setChecked(false); InterfPins dpins; //default pins if (!TypeToInterfPins(interf_type, dpins)) { qWarning() << Q_FUNC_INFO << " TypeToInterfPins(" << interf_type << ") Failed"; } cbxClockOutUSB->setCurrentIndex(dpins.clock); cbxControlOutUSB->setCurrentIndex(dpins.ctrl); cbxDataInUSB->setCurrentIndex(dpins.datain); cbxDataOutUSB->setCurrentIndex(dpins.dataout); cbxClockInUSB->setCurrentIndex(dpins.clockin); cbxControlInUSB->setCurrentIndex(dpins.ctrlin); cbxPowerOnUSB->setCurrentIndex(dpins.poweron); cbxEnaODUSB->setCurrentIndex(dpins.enbus); } void e2Dialog::on_pushDefaultsCOM_clicked() { ckControlOutCOM->setChecked(false); ckClockOutCOM->setChecked(false); ckDataInCOM->setChecked(false); ckDataOutCOM->setChecked(false); } void e2Dialog::on_pushDefaultsLPT_clicked() { ckControlOutLPT->setChecked(false); ckClockOutLPT->setChecked(false); ckDataInLPT->setChecked(false); ckDataOutLPT->setChecked(false); //ckPowerOnLPT->setChecked(false); //ckEnaODLPT->setChecked(false); ckClockInLPT->setChecked(false); //ckControlInLPT->setChecked(false); } void e2Dialog::on_pushDefaultsGPIO_clicked() { ckControlOutGPIO->setChecked(false); ckClockOutGPIO->setChecked(false); ckDataInGPIO->setChecked(false); ckDataOutGPIO->setChecked(false); ckPowerOnGPIO->setChecked(false); ckEnaODGPIO->setChecked(false); ckClockInGPIO->setChecked(false); ckControlInGPIO->setChecked(false); InterfPins dpins; //default pins if (!TypeToInterfPins(interf_type, dpins)) { qWarning() << Q_FUNC_INFO << " TypeToInterfPins(" << interf_type << ") Failed"; } cbxClockOutGPIO->setCurrentIndex(dpins.clock); cbxControlOutGPIO->setCurrentIndex(dpins.ctrl); cbxDataInGPIO->setCurrentIndex(dpins.datain); cbxDataOutGPIO->setCurrentIndex(dpins.dataout); //cbxClockOutGPIO->setCurrentIndex(DEF_GPIO_CLOCK); //cbxControlOutGPIO->setCurrentIndex(DEF_GPIO_CTRL); //cbxDataInGPIO->setCurrentIndex(DEF_GPIO_DATAIN); //cbxDataOutGPIO->setCurrentIndex(DEF_GPIO_DATAOUT); } void e2Dialog::recurseCbxHide(QObject *object) { QComboBox *combobox = dynamic_cast(object); if (0 != combobox) { combobox->hide(); } foreach (QObject *child, object->children()) { recurseCbxHide(child); } } tmp9balx013/SrcPony/e24xx-1.h0000644000175000017500000000445213616566001015611 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E24XX1_H #define _E24XX1_H #include "e24xx.h" class E24xx1 : public E24xx { public: E24xx1(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~E24xx1(); int Probe(int probe_size = 0); // int Read(int probe = 1, int type = ALL_TYPE); // int Write(int probe = 1, int type = ALL_TYPE); // int Verify(int type = ALL_TYPE); protected: private: }; #endif tmp9balx013/SrcPony/Translator.h0000644000175000017500000002101613616566001016625 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef LANGUAGE_HEADER #define LANGUAGE_HEADER #include #include class cTranslator { public: bool loadTranslation(const QString fname); public: static QString translate(int id); static QString engText[]; private: QString convertString(const QString &s); // Q_DISABLE_COPY(cTranslator); private: static QVector translateTable; }; // // all enums TR_CONSTS are for direct access to the text from engText or translateTable // not over maps or text id's // enum TR_CONSTS { STR_LANGUAGE_CODE = 0, MSG_TRANSLATORCREDITS, MSG_TRANSLATORNAME, STR_APPNAME_EXT, STR_APPDOWNLOAD1, STR_APPDOWNLOAD2, STR_NONAME, STR_BTNOK, STR_BTNCANC, STR_BTNHELP, STR_BTNPROBE, STR_BTNCHECKHW, STR_BTNNOTE, STR_BTNEDIT, //Dialog messages STR_MSGVERSION, STR_YES, STR_NO, STR_OK, STR_TEST, STR_MSGFAILED, STR_ABOUT, STR_MSGPAGE, STR_MSGUNKNOWN, STR_BUFCHANGED, STR_BUFCHANGED2, STR_NOTHINGSAVE, STR_NOTHINGLOAD, STR_NOTHINGPRINT, STR_NOTHINGWRITE, STR_NOTHINGVERIFY, STR_BUSCALIBRA1, STR_BUSCALIBRA2, STR_BUSCALIBRAOK, STR_BUSCALIBRAFAIL, STR_MSGNEEDCALIB, STR_MSGNEEDSETUP, STR_MSGREADING, STR_MSGREADOK, STR_ASKWRITE, STR_MSGWRITING, STR_MSGVERIFING, STR_MSGWRITEOK, STR_MSGWRITEFAIL, STR_MSGERASING, STR_MSGERASEOK, STR_MSGVERIFYFAIL1, STR_MSGVERIFYFAIL2, STR_MSGVERIFYOK, STR_MSGPROGRAMOK, STR_MSGPROGRAMFAIL, STR_MSGDEVRESET, STR_MSGWRITINGSEC, STR_MSGWRITESECFAIL, STR_MSGREADINGSEC, STR_MSGREADSECFAIL, STR_MSGREADINGFUSE, STR_MSGREADFUSEFAIL, STR_MSGWRITINGFUSE, STR_MSGWRITEFUSEFAIL, STR_MSGSCRIPTERROR, STR_MSGSCRIPTBADCOMMAND, STR_MSGSCRIPTBADARGUMENT, STR_MSGSCRIPTARGMISSING, STR_MSGDEFAULTPAUSE, STR_BUFEMPTY, STR_OPNOTSUP, STR_MSGINSPARAM, STR_MSGBADPARAM, STR_MSGACCEPTCMD, STR_MSGOPENFILE, STR_MSGOPENPROGFILE, STR_MSGOPENDATAFILE, STR_MSGFILENOTFOUND, STR_MSGFILESAVEFAIL, STR_MSGFILESAVEAS, STR_MSGFILESAVEPROG, STR_MSGFILESAVEDATA, STR_MSGCLOSEWINEXIT, STR_MSGCLOSEWINSAVE, STR_MSGOPENSCRIPT, //Menu entries //Main Menu STR_MENUFILE, STR_MENUEDIT, STR_MENUDEVICE, STR_MENUCMD, STR_MENUSCRIPT, STR_MENUUTIL, STR_MENUSETUP, STR_MENUOPTIONS, STR_MENUQMARK, //Menu File STR_NEWWIN, STR_OPEN, STR_OPENFLASH, STR_OPENDATA, STR_SAVE, STR_SAVEAS, STR_SAVEFLASH, STR_SAVEDATA, STR_RELOAD, STR_PRINT, STR_CLOSE, STR_EXIT, //Menu Edit STR_EDITNOTE, STR_EDITBUFENA, //Menu Command STR_READALL, STR_READPROG, STR_READDATA, STR_READSECBITS, STR_WRITEALL, STR_WRITEPROG, STR_WRITEDATA, STR_WRITESECBITS, STR_VERIFYALL, STR_VERIFYPROG, STR_VERIFYDATA, STR_VERIFYSECBITS, STR_ERASE, STR_GETINFO, STR_RESET, STR_PROGRAM, STR_PROGOPTION, //Menu Options STR_INTERFSETUP, STR_CALIBRATION, STR_REMOTEMODE, //Menu Utility STR_CLEARBUF, STR_FILLBUF, STR_DOUBLEBANK, STR_BYTESWAP, STR_DOWNSERNUM, STR_SERNUMCONF, //Menu Help STR_MENUHELP, STR_MENUABOUT, //Menu Options STR_MENULOG, //Menu Script STR_EDITSCR, STR_LOADSCR, STR_AUTOLOADSCR, STR_RUNSCR, //Tool Bar //Dialog Messages STR_MSGDEVTYPE, //Tool tips STR_TTOPENFILE, STR_TTSAVEFILE, STR_TTPRINT, STR_TTRELOAD, STR_TTREADALL, STR_TTREADPROG, STR_TTREADDATA, STR_TTREADSEC, STR_TTWRITEALL, STR_TTWRITEPROG, STR_TTWRITEDATA, // STR_TTWRITESEC = "Write Security and Configuration Bits" STR_TTVERIFYPROG, STR_TTVERIFYDATA, STR_TTVERIFYSEC, STR_TTSELFAMILY, STR_TTSELTYPE, STR_TTEDITNOTE, //Error Messages STR_DEVNOTRESP, STR_DEVBADTYPE, STR_DEVUNKNOWN, STR_DEVLOCKED, STR_OPABORTED, STR_OPENFAILED, STR_ACCDENIED, STR_NOTINST, STR_HWERROR, STR_BUSBUSY, STR_I2CNOACK, STR_I2CNODEV, STR_I2CTIMEOUT, STR_I2CSTOPERR, STR_WRITEERR, STR_BLANKCHECKERR, STR_ERRNO, STR_SCRIPTERROR, //----Setup dialog //Dialog title STR_DLGIOSETUP, STR_MSGINTSETUP, //Dialog messages STR_LBLCOMLPT, STR_LBLSERIAL, STR_LBLPARALLEL, STR_LBLINTERFSEL, STR_LBLINTERFTYPE, STR_LBLCOMSELECT, STR_LBLCOM1, STR_LBLUSBSELECT, STR_LBLUSB1, STR_LBLLPTSELECT, STR_LBLLPT1, STR_LBLSELPOLARITY, STR_LBLINVRESET, STR_LBLINVSCK, STR_LBLINVDATAIN, STR_LBLINVDATAOUT, //Tool tips STR_TTCOM1, STR_TTUSB1, STR_TTLPT1, //----Fill dialog //Dialog title STR_LBLFILLBUF, //Dialog messages: NB should be of the same size (number of char) STR_LBLFROM, STR_LBLTO, STR_LBLVALUE, //----Fuse dialog //Button captions STR_BTNCLRALL, STR_BTNSETALL, STR_BTNWRITE, STR_BTNREAD, //Dialog title STR_MSGFUSEDLG, //Dialog messages: NB should be of the same size (number of char) STR_MSGFIRSTBLK, STR_MSGNUMBLOCK, STR_MSGHIGHENDBLK, //Tool tips STR_TTCLRALL, STR_TTSETALL, STR_TTWRITE, STR_TTREAD, //----Info dialog //Button captions STR_BTNCLOSE, //Dialog title STR_MSGDEVINFO, //Dialog messages STR_MSGBANKROLL, STR_MSGSIZE, STR_MSGCRC, STR_MSGSECBLOCK, STR_HIGHENDURAN, //----Char Edit dialog //Dialog title STR_MSGEDITBUG, //Dialog messages: NB should be of the same size (number of char) STR_MSGHEX, STR_MSGDECIMAL, STR_MSGCHAR, STR_MSGINSNEWVAL, STR_MSGENTERTEXT, //Tool tips STR_TTHEX, STR_TTDECIMAL, STR_TTCHAR, //----Program Option dialog //Dialog title STR_MSGPROGOPT, //Dialog messages STR_MSGRELOAD, STR_MSGREADPROG, STR_MSGREADDATA, STR_MSGREADSERNUM, STR_MSGBYTESWAP, STR_MSGSERNUM, STR_MSGERASE, STR_MSGWRITEPROG, STR_MSGWRITEDATA, STR_MSGWRITESEC, STR_MSGVERIFYSEC, //----Serial Number dialog //Dialog title STR_MSGSERNUMCFG, //Dialog messages: NB should be of the same size (number of char) STR_MSGADDRESS, STR_MSGSIZE2, STR_MSGVALUE, STR_MSGFORMAT, //next 2 probably can't be translated STR_MSGLITTLEEND, STR_MSGBIGENDIAN, STR_MSGOFFSET, //Tool tips STR_TTSNMEMADDR, STR_TTSNSIZE, STR_TTSNVALUE, STR_TTSNOFFSET, STR_TTLITTLEEND, STR_TTBIGENDIAN, //----Retry dialog //Button captions STR_ABORT, STR_RETRY, STR_IGNORE, //Dialog title STR_MSGALERT, //----Notes dialog //Dialog title STR_MSGDEVNOTE, //----Progress dialog //Dialog title STR_MSGSTATUS, //----Hardware check dialog STR_MSGHWCHECKDLG, //----About dialog STR_LBLNOSOUND, STR_LBLSKIPMSG, //---- Oscillator Calibration Byte STR_MSGOSCCALIBCFG, STR_READOSCCALIB, STR_OSCCALIBOPTION, STR_MSGREADCALIBOK, STR_MSGCHIPID, STR_MSGNOTE, STR_MSGEEPSIZE, STR_MSGFLASHSIZE, STR_MSGSNAUTOINC, STR_TTSNAUTOINC, STR_MSGBANKROLLOVER, STR_BUFCHANGED3, STR_TTOPENPROG, STR_TTOPENDATA, STR_TTSAVEPROG, STR_TTSAVEDATA, STR_TTNEWWIN, STR_TTPROGRAM, STR_TTSCRIPT, STR_TTSETUP, STR_TTERASE, STR_SECBITS, STR_TTSECBITS, STR_LBLFUSEDLGHLP, STR_FUSEDLGNOTESET, STR_FUSEDLGNOTECLR, STR_CALIBRENABLED, STR_PREFERENCES, //287 STR_EXTRAPROBEMSG_FTPROG }; #endif tmp9balx013/SrcPony/x2444bus.cpp0000644000175000017500000001166713616566001016341 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2007 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "x2444bus.h" #include "errcode.h" #include #include "e2cmdw.h" #define _BIG_ENDIAN_ X2444Bus::X2444Bus(BusInterface *ptr) : MicroWireBus(ptr), ReadCode(06), WriteCode(03), WriteEnableCode(04), WriteDisableCode(00), RecallCode(05), StoreCode(01), loop_timeout(8000), organization(ORG16) { qDebug() << Q_FUNC_INFO; } void X2444Bus::SendCmdAddr(int cmd, int addr) { if (organization == ORG16) { SendDataWord(0x80 | ((addr & 0x0f) << 3) | (cmd & 7), 8); } else { SendDataWord(0x80 | ((addr & 0x07) << 4) | (cmd & 7), 8); } } long X2444Bus::Read(int addr, uint8_t *data, long length, int page_size) { qDebug() << Q_FUNC_INFO << "(" << (hex) << addr << ", " << data << ", " << (dec) << length << ")"; ReadStart(); long len; int inc; addr = 0; if (organization == ORG16) { inc = 2; } else { inc = 1; } //Prima assicuriamoci una recall clearCS(); ShotDelay(); setCS(); SendCmdAddr(RecallCode, 0xff); //Dal piu` significativo al meno significativo for (len = 0; len < length; len += inc) { //17/08/98 -- now repeat the command every word clearCS(); ShotDelay(); setCS(); //Send command opcode and address SendCmdAddr(ReadCode, addr++); //The first bit after read command is "shorter" // so we have to use a special function uint16_t val = RecDataWordShort(organization, true); if (organization == ORG16) { #ifdef _BIG_ENDIAN_ *data++ = (uint8_t)(val >> 8); *data++ = (uint8_t)(val & 0xFF); #else *data++ = (uint8_t)(val & 0xFF); *data++ = (uint8_t)(val >> 8); #endif } else { *data++ = (uint8_t)(val & 0xFF); } WaitUsec(1); if ((len & 1)) { if (ReadProgress(len * 100 / length)) { break; } } } clearCS(); WaitMsec(1); //Flush ReadEnd(); qDebug() << Q_FUNC_INFO << "=" << len; return len; } long X2444Bus::Write(int addr, uint8_t const *data, long length, int page_size) { long curaddr; WriteStart(); clearCS(); //17/08/98 -- may be it's not needed ShotDelay(); setCS(); //Recall eeprom from ram SendCmdAddr(RecallCode, 0xff); clearCS(); ShotDelay(); setCS(); //Write enable SendCmdAddr(WriteEnableCode, 0xff); clearCS(); ShotDelay(); setCS(); if (organization == ORG16) { length >>= 1; //byte to word counter } for (curaddr = 0; curaddr < length; curaddr++) { uint16_t val; if (organization == ORG16) { #ifdef _BIG_ENDIAN_ val = (uint16_t)(*data++) << 8; val |= (uint16_t)(*data++); #else val = (uint16_t)(*data++); val |= (uint16_t)(*data++) << 8; #endif } else { val = *data++; } //Send command opcode SendCmdAddr(WriteCode, curaddr); SendDataWord(val, organization, true); ShotDelay(); clearCS(); ShotDelay(); setCS(); if ((curaddr & 1)) { if (WriteProgress(curaddr * 100 / length)) { break; } } } SendCmdAddr(StoreCode, 0xff); clearCS(); WaitMsec(10); //Flush WriteEnd(); if (organization == ORG16) { curaddr <<= 1; //word to byte counter } return curaddr; } tmp9balx013/SrcPony/imbus.cpp0000644000175000017500000002021113616566001016142 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "imbus.h" #include "errcode.h" #include #include #include "e2cmdw.h" #ifdef Q_OS_LINUX # include #else # ifdef __BORLANDC__ # define __inline__ # else // _MICROSOFT_ VC++ # define __inline__ __inline # define _export # endif #endif #define IMADDR_ADDR(x) ( (x) ? 132 : 128 ) #define IMADDR_READ(x) ( (x) ? 133 : 129 ) #define IMADDR_WRITE(x) ( (x) ? 135 : 131 ) // Costruttore IMBus::IMBus(BusInterface *ptr) : BusIO(ptr) { qDebug() << Q_FUNC_INFO; StatusLocation = 526; //526 for NVM3060, 14 for MDA2062 SecondaryAddress = false; Data16_mode = true; ProgDelay = 30; } // Distruttore IMBus::~IMBus() { qDebug() << Q_FUNC_INFO; } void IMBus::SetStatusLocation(int val) { if (val >= 0) { StatusLocation = val; } } void IMBus::UseSecondaryAddress(bool val) { SecondaryAddress = val; } void IMBus::SetDataMode(int val) { if (val == 16) { Data16_mode = true; } else if (val == 8) { Data16_mode = false; } } void IMBus::SetProgDelay(int val) { ProgDelay = val; } void IMBus::SetDelay() { int val = E2Profile::GetIMBusSpeed(); int n; switch (val) { case TURBO: n = 1; // as fast as your PC can break; case FAST: n = 4; break; case SLOW: n = 30; break; case VERYSLOW: n = 100; break; case ULTRASLOW: n = 500; break; default: n = 10; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } int IMBus::SendDataBit(int b) { //clearCLK(); //set clock low //bitDI(b); //ShotDelay(); //setCLK(); //device latch data bit now! //ShotDelay(); int err = OK; setCLK(); busI->xferBit(err, b, SPI_MODE_3 | xMODE_WRONLY); return err; } // return negative number in case of error, otherwise received bit (0 or 1) int IMBus::RecDataBit() { //clearCLK(); //the eeprom set data now //ShotDelay(); //setCLK(); //b = getDO(); //ShotDelay(); int err = OK; setCLK(); int rv = busI->xferBit(err, 1, SPI_MODE_3 | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int IMBus::IdentPulse() { clearIdent(); ShotDelay(6); setIdent(); ShotDelay(2); return OK; } //byte operations int IMBus::SendAddrWord(int wo) { int err = OK; setCLK(); clearIdent(); //From LSB to MSB //for (int k = 0; k < 8; k++) // SendDataBit(wo & (1 << k)); busI->xferByte(err, wo, SPI_MODE_3 | xMODE_WRONLY, 8, true); setCLK(); setDI(); setIdent(); ShotDelay(2); //1.5 usec return err; } int IMBus::SendDataWord(long wo, int wlen) { int err = OK; setCLK(); setIdent(); //From LSB to MSB //for (int k = 0; k < wlen; k++) // SendDataBit(wo & (1 << k)); busI->xferWord(err, wo, SPI_MODE_3 | xMODE_WRONLY, wlen, true); setCLK(); setDI(); return err; } int IMBus::RecDataWord(int wlen) { int err = OK; setCLK(); setDI(); setIdent(); //int val = 0; //for (int k = 0; k < wlen; k++) // if (RecDataBit()) // val |= 1 << k; int rv = busI->xferWord(err, 0xffff, SPI_MODE_3 | xMODE_RDONLY, wlen, true); if (err == OK) { return rv; } else { return err; } } int IMBus::WaitReadyAfterWrite(int addr, int delay, long timeout) { int rval = OK; if (delay > 0) { WaitMsec(delay); } else { uint8_t val = 0xff; while ((val & (1 << 1)) && timeout--) { //Read status location at address 526 //Send address code SendAddrWord(IMADDR_ADDR(SecondaryAddress)); SendDataWord(StatusLocation, Data16_mode ? 16 : 8); IdentPulse(); //Receive data SendAddrWord(IMADDR_READ(SecondaryAddress)); val = (uint8_t)RecDataWord(Data16_mode ? 16 : 8); IdentPulse(); } if (timeout == 0) { rval = E2P_TIMEOUT; } } return rval; } int IMBus::Reset(void) { qDebug() << "IMBus::Reset()"; SetDelay(); setCLK(); //clock = 1 setDI(); //data = 1 setIdent(); //Ident = 1 WaitMsec(50); return OK; } long IMBus::Read(int addr, uint8_t *data, long length, int page_size) { qDebug() << "IMBus::Read(" << (hex) << addr << ", " << data << ", " << (dec) << length << ")"; ReadStart(); long len; for (len = 0; len < length; len++, addr++) { //Send address code SendAddrWord(IMADDR_ADDR(SecondaryAddress)); SendDataWord(addr, Data16_mode ? 16 : 8); IdentPulse(); //Receive data SendAddrWord(IMADDR_READ(SecondaryAddress)); *data++ = (uint8_t)RecDataWord(Data16_mode ? 16 : 8); IdentPulse(); if ((len % 4) == 0) { if (ReadProgress(len * 100 / length)) { break; } } } ReadEnd(); qDebug() << "IMBus::Read() = " << len; return len; } long IMBus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; uint8_t bval; int loop_timeout; WriteStart(); for (len = 0; len < length; len++, addr++, data++) { bval = ~ *data; //be sure are different to write at least once for (loop_timeout = 10; bval != *data && loop_timeout > 0; loop_timeout--) { //Erase command first //Send address code SendAddrWord(IMADDR_ADDR(SecondaryAddress)); SendDataWord(addr, Data16_mode ? 16 : 8); IdentPulse(); //Erase location SendAddrWord(IMADDR_WRITE(SecondaryAddress)); SendDataWord(0xffff, Data16_mode ? 16 : 8); IdentPulse(); if (WaitReadyAfterWrite(addr, ProgDelay) != OK) { return E2P_TIMEOUT; } //Write command if (ProgDelay <= 0) //Ripristina l'indirizzo corretto (solo se ` attivo il polling) { //Send address code SendAddrWord(IMADDR_ADDR(SecondaryAddress)); SendDataWord(addr, Data16_mode ? 16 : 8); IdentPulse(); } //Program location SendAddrWord(IMADDR_WRITE(SecondaryAddress)); SendDataWord(*data, Data16_mode ? 16 : 8); IdentPulse(); if (WaitReadyAfterWrite(addr, ProgDelay) != OK) { return E2P_TIMEOUT; } //Verify while write //Send address code SendAddrWord(IMADDR_ADDR(SecondaryAddress)); SendDataWord(addr, Data16_mode ? 16 : 8); IdentPulse(); //Receive data SendAddrWord(IMADDR_READ(SecondaryAddress)); bval = (uint8_t)RecDataWord(Data16_mode ? 16 : 8); IdentPulse(); } //for if (loop_timeout == 0) { return E2ERR_WRITEFAILED; } if (WriteProgress(len * 100 / length)) { break; } } WriteEnd(); return len; } tmp9balx013/SrcPony/Translator.cpp0000644000175000017500000003716113616566001017170 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include // #include "MainWindow.h" #include "Translator.h" QVector cTranslator::translateTable; QString cTranslator::engText[] = { "english", //Fill this with your reference, if it's empty = ""it will be invisible "Translator Credits:", "", "Serial Device Programmer", "You can find last version of", "at the address:", "No Name", //Button captions #ifdef Q_OS_WIN32 "&OK", "&Cancel", "&Help", "&Probe", #else "OK", "Cancel", "Help", "Probe", #endif "Hardware Check", "Note", "Edit", //Dialog messages "Version", "Yes", "No", "Ok", "Test", "Failed", "About", "Page", "Unknown", "Buffer \"%s\" changed. Save it before closing?", "Buffer changed. Save it before opening?", "Nothing to save", "Nothing to load", "Nothing to print", "Nothing to write", "Nothing to verify", "Bus timing calibration.\nBe sure there are no application running other than ", "\n(the CPU and hard disk have to be idle)\nThe calibration may take a couple of seconds.\nDo you want to run calibration now?", "Calibration OK", "Calibration failed", "You need to run Calibration from the Options menu\nbefore any read/write operations", "You need to run Setup from the Options menu\nbefore any read/write operations", "Reading...", "Read successful\nDevice Size:", "Are you sure you want to write the device?\nAll previous content will be lost", "Writing...", "Verifying...", "Write successful", "Write failed", "Erasing...", "Erase successful", "Cannot verify, device missing or bad device", "Verify Failed", "Verify successful", "Program successful", "Program Failed", "Device reset", "Writing security bits...", "Security bits write failed", "Reading security bits...", "Security bits read failed", "Reading configuration bits...", "Configuration bits read failed", "Writing configuration bits...", "Configuration bits write failed", "Script error at line", "Bad command", "Bad argument", "Argument missing", "Do you want to continue?", "Buffer empty", "Operation not supported", "Insert parameters", "Bad parameters", "Accepting commands...", "Open device content file", "Open program (FLASH) content file", "Open data (EEPROM) content file", "File not found", "File save failed", "Save Device Content File As", "Save Program (FLASH) Content File As", "Save Data (EEPROM) Content File As", "Close last window: do you want to exit?", "Buffer changed. Save it before closing?", "Open script file", //Menu entries //Main Menu "&File", "&Edit", "&Device", "&Command", "Scri&pt", "&Utility", "&Setup", "&Options", "&?", //Menu File "&New Window", "&Open Device File...", "Open &Program (FLASH) File...", "Open &Data (EEPROM) File...", "&Save Device File", "Save Device File &As...", "Save Program (&FLASH) File As...", "Save Data (&EEPROM) File As...", "&Reload Files", "Prin&t...", "&Close", "E&xit", //Menu Edit "Edit &Note...", "Edit Bu&ffer enabled", //Menu Command "&Read All", "Read Program (FLASH)", "Read Data (EEPROM)", "Read &Security and Configuration Bits", "&Write All", "Write Program (&FLASH)", "Write Data (EEPROM)", "Wr&ite Security and Configuration Bits", "&Verify All", "Verify Program (FLASH)", "Verify Data (EEPROM)", "Verif&y Security and Configuration Bits", "&Erase", "&GetInfo", "Rese&t", "&Program", "Program Options...", //Menu Options "&Interface Setup...", "&Calibration", "&Remote Mode", //Menu Utility "&Clear Buffer", "&Fill Buffer...", "&Double Bank", "&Byte Swap", "Set Serial&Number", "SerialNumber C&onfig...", //Menu Help "&Help", "&About", //Menu Options "&Log File...", //Menu Script "&Edit...", "&Load and Run...", "&Auto Load", "&Run", //Tool Bar //Dialog Messages "Dev.Type", //Tool tips "Open Device File", "Save Device File", "Print Buffer", "Reload Files", "Read Device", "Read Program Memory (FLASH)", "Read Data Memory (EEPROM)", "Read Security and Configuration Bits", "Write Device", "Write Program Memory (FLASH)", "Write Data Memory (EEPROM)", // STR_TTWRITESEC = "Write Security and Configuration Bits" "Verify Program Memory (FLASH)", "Verify Data Memory (EEPROM)", "Verify Security and Configuration Bits", "Select device family", "Select device type", "Edit device notes", //Error Messages "Device Not Responding", "Bad device, select the correct type", "Device missing or unknown device", "Unable to probe, bad device or device locked", "User abort", "Communication port not available", "I/O access denied. You must be root to perform I/O", "Programmer board not found", "Hardware error, is the board properly connected?", "Bus busy or hardware error", "Missing Acknowledge from the device", "Missing device", "Timeout on the bus", "I2CBus Stop condition error (bad timing?)", "Write error", "Blank check error, need to erase", "Error n.", "Script error", //----Setup dialog //Dialog title "I/O port setup", "Interface board Setup", //Dialog messages "COM/LPT interface", "Serial", "Parallel", "Interface select", "Interface type", "COM Port select", #ifdef Q_OS_WIN32 "COM", // STR_LBLCOM2 = "COM2", // STR_LBLCOM3 = "COM3", // STR_LBLCOM4 = "COM4", #else "ttyS", // STR_LBLCOM2 = "ttyS1", // STR_LBLCOM3 = "ttyS2", // STR_LBLCOM4 = "ttyS3", #endif "USB Port select", #ifdef Q_OS_WIN32 "USB", // STR_LBLUSB2 = "USB2", // STR_LBLUSB3 = "USB3", // STR_LBLUSB4 = "USB4", // STR_LBLUSB5 = "USB5", // STR_LBLUSB6 = "USB6", // STR_LBLUSB7 = "USB7", // STR_LBLUSB8 = "USB8", #else "ttyUSB", // STR_LBLUSB2 = "ttyS1", // STR_LBLUSB3 = "ttyS2", // STR_LBLUSB4 = "ttyS3", // STR_LBLUSB5 = "ttyS4", // STR_LBLUSB6 = "ttyS5", // STR_LBLUSB7 = "ttyS6", // STR_LBLUSB8 = "ttyS7", #endif "LPT Port select", "LPT", // STR_LBLLPT2 = "LPT2", // STR_LBLLPT3 = "LPT3", // STR_LBLLPT4 = "LPT4", "Select Polarity of the Control lines", "Invert Reset", "Invert SCKL", "Invert D-IN", "Invert D-OUT", //Tool tips "Select serial port COM1", // STR_TTCOM2 = "Select serial port COM2", // STR_TTCOM3 = "Select serial port COM3", // STR_TTCOM4 = "Select serial port COM4", "Select serial port USB1", // STR_TTUSB2 = "Select serial port USB2", // STR_TTUSB3 = "Select serial port USB3", // STR_TTUSB4 = "Select serial port USB4", // STR_TTUSB5 = "Select serial port USB5", // STR_TTUSB6 = "Select serial port USB6", // STR_TTUSB7 = "Select serial port USB7", // STR_TTUSB8 = "Select serial port USB8", "Select parallel port LPT1", // STR_TTLPT2 = "Select parallel port LPT2", // STR_TTLPT3 = "Select parallel port LPT3", //----Fill dialog //Dialog title "Fill Buffer", //Dialog messages: NB should be of the same size (number of char) "From", "To", "Value", //----Fuse dialog //Button captions #ifdef Q_OS_WIN32 "C&lear All", "&Set All", "&Write", "&Read", #else "Clear All", "Set All", "Write", "Read", #endif //Dialog title "Configuration and Security bits", //Dialog messages: NB should be of the same size (number of char) "First Block to Lock", "N.of Blocks to Lock", "High endurance block", //Tool tips "All bits to '0'", "All bits to '1'", "Write bits to the device", "Read bits from the device", //----Info dialog //Button captions #ifdef Q_OS_WIN32 "&Close", #else "Close", #endif //Dialog title "Device Info", //Dialog messages "Bank roll-over capability:", "Size:", "CRC:", "Security block:", "High endurance block:", //----Char Edit dialog //Dialog title "Edit Buffer", //Dialog messages: NB should be of the same size (number of char) "Hex", "Decimal", "Char", "Insert the new value", "Enter text from the address", //Tool tips "Hexadecimal value", "Decimal value", "Char value", //----Program Option dialog //Dialog title "Program Options", //Dialog messages "Reload Files", "Read Program memory (FLASH)", "Read Data memory (EEPROM)", "Read Seriial Number", "Byte Swap", "Set Serial Number", "Erase", "Write Program memory (FLASH)", "Write Data memory (EEPROM)", "Write Security and Config bits", "Verify Security and Config bits", //----Serial Number dialog //Dialog title "Serial Number Config", //Dialog messages: NB should be of the same size (number of char) "Address", "Size", "Value", "Format", //next 2 probably can't be translated "Little endian", "Big endian", "Data memory offset", //Tool tips "Memory address", "Size in bytes", "Next value to be used", "Assume the Address relative to Data memory instead of Program memory", "Most significant Byte at high address", "Most significant Byte at low address", //----Retry dialog //Button captions #ifdef Q_OS_WIN32 "&Abort", "&Retry", "&Ignore", #else "Abort", "Retry", "Ignore", #endif //Dialog title "Alert", //----Notes dialog //Dialog title "Edit Device Notes", //----Progress dialog //Dialog title "Status", //----Hardware check dialog "Hardware Check", //----About dialog "Disable sound", "Don't show this window on startup", //---- Oscillator Calibration Byte "Oscillator Calibration Byte", "Read Osc.Calibration Byte", "Osc. Calibration Options...", "Read Osc.Calibration Byte successful", "Chip Id", "Note", "EEPROM Size", "FLASH Size", "Auto Increment", "Increment the serial number after every 'set serial number' operation", "Can't know bank roll-over without modify and write, do you want to write?", "Buffer changed. Save it before reading?", "Open Program Memory (FLASH) File", "Open Data Memory (EEPROM) File", "Save Program Memory (FLASH) File", "Save Data Memory (EEPROM) File", "New Window", "Launch program cycle", "Execute script", "Open setup dialog", "Erase all the device to FF", "Security and Configuration &Bits...", "Security and Configuration Bits", "Refer to device datasheet, please", "Checked items means programmed", "UnChecked items means unprogrammed", "Save the result in the buffer at given location", "Preferences", //STR_PREFERENCES "Be sure the VTarget is on (check J3) and NO target attached for the test" //STR_EXTRAPROBEMSG_FTPROG }; bool cTranslator::loadTranslation(const QString fname) { QFile langFile(fname); short vecSize = (short)(sizeof(engText) / sizeof(char *)); translateTable.clear(); translateTable.resize(vecSize + 1); if (!langFile.open(QIODevice::ReadOnly)) { return false; } QTextStream stream(&langFile); stream.setCodec("UTF-8"); QString llEng = stream.readLine(); if (llEng.length() > 0) { llEng.remove("\n"); } if (llEng == "LANGUAGE_NAME") { translateTable << llEng; } else { QMessageBox::warning(NULL, "File error", "File is not a language file!", QMessageBox::Close); langFile.close(); return (false); } bool begTranslation = false; while (!stream.atEnd()) { llEng = stream.readLine(); if (llEng == "LANGUAGE_CHARSET") { llEng = stream.readLine(); stream.setCodec(llEng.toLatin1()); continue; } QString tmpText = convertString(llEng); // when at end of string if (tmpText.lastIndexOf("\\") >= tmpText.length() - 2) { llEng += tmpText; // qDebug() << tmpText; continue; } else { llEng = tmpText; } if (llEng.indexOf(QRegExp("t[0-9]+=")) == 0) { QString str; int pos = llEng.indexOf("="); if (pos > 0) { str = llEng.mid(pos + 1); // int num = llEng.mid(1, pos - 1).toShort(); // qDebug() << num << str; if (num >= vecSize) { qDebug() << "size too big"; } else { translateTable[num] = str; } } } else { if (llEng == "Ok") // translation part beginns with "Ok" { begTranslation = true; } if (begTranslation == false) { continue; } bool found = false; QString llTranslate = stream.readLine(); if (llTranslate.length() == 0) { continue; } llTranslate = convertString(llTranslate); for (int i = 0; i < vecSize; i++) // suche { QString tmpEng = engText[i]; if (tmpEng.indexOf("%HOME%") >= 0) { tmpEng.replace("%HOME%", QDir::homePath()); } if (tmpEng == llEng) { translateTable[i] = llTranslate; found = true; break; } } if (found == false) { qDebug() << "no translation found" << llEng; } } } langFile.close(); return (true); } QString cTranslator::convertString(const QString &s) { QString res = s; if (res.length() > 0) { res.replace("\\r\\n", "\n"); res.replace("\\n", "\n"); res.replace("\\t", "\t"); res.replace("\\\\", "/"); res.replace("&", "&"); res.replace(">", ">"); res.replace("<", "<"); } if (res.length() == 0) { return res; } if (res.indexOf("C:/") >= 0) { res.replace("C:/", "%HOME%/"); } if (res.indexOf("c:/") >= 0) { res.replace("c:/", "%HOME%/"); } if (res.indexOf("%HOME%") >= 0) { res.replace("%HOME%", QDir::homePath()); } return res; } QString cTranslator::translate(int id) { QString m; if (id < 0) { return ""; } if (id >= (int)(sizeof(engText) / sizeof(char *))) { return ""; } if (translateTable.size() == 0) { return QString(engText[id]); } // if (id < (int)(sizeof(engText) / sizeof(char*))) { if (translateTable[id].length() == 0) { m = QString(engText[id]); } else { m = translateTable[id]; } if (m.indexOf("%HOME%") >= 0) { m.replace("%HOME%", QDir::homePath()); } // } return m; } tmp9balx013/SrcPony/binfbuf.h0000644000175000017500000000447413616566001016120 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _BINFBUF_H #define _BINFBUF_H // Include standard V files as needed #include "types.h" #include "filebuf.h" class binFileBuf : public FileBuf { public: binFileBuf(e2AppWinInfo *wininfo = 0); virtual ~binFileBuf(); virtual int Load(int loadtype = ALL_TYPE, long relocation_offset = 0); virtual int Save(int savetype = ALL_TYPE, long relocation_offset = 0); protected: private: }; #endif tmp9balx013/SrcPony/blockmdlg.cpp0000644000175000017500000000715413616566001016774 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "blockmdlg.h" #include blockDialog::blockDialog(e2CmdWindow *bw, e2AppWinInfo *p, bool readonly, const QString &msg) : QDialog(bw) { setupUi(this); setWindowTitle(translate(STR_MSGFUSEDLG)); awip = p; lock = awip->GetLockBits(); fuse = awip->GetFuseBits(); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } qDebug() << "blockDialog::blockDialog()"; lblFrom->setText(translate(STR_MSGFIRSTBLK)); lblTo->setText(translate(STR_MSGNUMBLOCK)); lblVal->setText(translate(STR_MSGHIGHENDBLK)); QString str1 = QString().sprintf("%d", (int)((lock >> 4) & 0x0F)); QString str2 = QString().sprintf("%d", (int)(lock & 0x0F)); QString str3 = QString().sprintf("%d", (int)(fuse & 0x0F)); txiFrom->setText(str1); txiTo->setText(str2); txiVal->setText(str3); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); if (readonly) { pushOk->setEnabled(false); } else { pushOk->setEnabled(true); } connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } blockDialog::~blockDialog() { qDebug() << "blockDialog::~blockDialog()"; } void blockDialog::onOk() { bool good; QString str = txiFrom->text(); fuse = 0; lock = 0; int From = str.toInt(&good); if (good == false) { reject(); } str = txiTo->text(); int To = str.toInt(&good); if (good == false) { reject(); } str = txiVal->text(); int Val = str.toInt(&good); if (good == false) { reject(); } lock = ((From << 4) & 0xF0) | (To & 0x0F); fuse = Val & 0x0F; awip->SetLockBits(lock); awip->SetFuseBits(fuse); accept(); } tmp9balx013/SrcPony/at25xxx.h0000644000175000017500000000437113616566001016024 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT25XXX_H #define _AT25XXX_H #include "types.h" #include "at250xx.h" #include "at250bus2.h" class At25xxx : public At250xx { public: At25xxx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~At25xxx(); protected: At250BigBus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/resource.h0000644000175000017500000000107013616566001016321 0ustar carstencarsten//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by Pony.rc // #define IDI_PONYICON 101 #define IDI_ICON1 111 #define VAPPICON2 112 #define VAPPICON1 114 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 115 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif tmp9balx013/SrcPony/pic168xx.h0000644000175000017500000000475213616566001016076 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PIC168XX_H #define _PIC168XX_H #include "pic16xx.h" #include "picbusnew.h" class Pic168xx : public Pic16xx { public: Pic168xx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~Pic168xx(); int Probe(int probe_size = 0); // int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); // int Verify(int type = ALL_TYPE); protected: PicBus *GetBus() { return static_cast(Device::GetBus()); } int QueryType(long &type); int CodeProtectAdjust(uint16_t &config, int read = 0); private: }; #endif tmp9balx013/SrcPony/spi-bus.cpp0000644000175000017500000000724713616566001016423 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "globals.h" #include "spi-bus.h" #include "errcode.h" #include "e2cmdw.h" #include #include SPIBus::SPIBus(BusInterface *ptr, bool cpha, bool cpol) : BusIO(ptr), m_cpol(cpol), m_cpha(cpha) { } SPIBus::~SPIBus() { } void SPIBus::SetDelay() { int val = E2Profile::GetSPISpeed(); int n; switch (val) { case TURBO: n = 0; // as fast as your PC can break; case FAST: n = 1; break; case SLOW: n = 10; break; case VERYSLOW: n = 80; break; case ULTRASLOW: n = 1000; break; default: n = 5; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "() = " << n; } int SPIBus::SendDataBit(int b) { int err = OK; busI->xferBit(err, b, GetMode() | xMODE_WRONLY); return err; } int SPIBus::RecDataBit() { int err = OK; int rv = busI->xferBit(err, 1, GetMode() | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int SPIBus::SendDataByte(int by) { int err = OK; busI->xferByte(err, by, GetMode() | xMODE_WRONLY); return err; } int SPIBus::RecDataByte() { int err = OK; int rv = busI->xferByte(err, 0xff, GetMode() | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int SPIBus::Reset(void) { qDebug() << Q_FUNC_INFO << "IN"; SetDelay(); clearSCK(); // AVR datasheet setMOSI(); // the datasheet doesn't specify, but with SIProg we need to provide power from at least one line (MOSI while SCK and RESET are low) WaitMsec(20); ClearReset(); //One pulse on the reset (datasheet AVR) WaitMsec(E2Profile::GetSPIResetPulse()); //AppNote AVR910 suggest >100 msec SetReset(); WaitMsec(E2Profile::GetSPIDelayAfterReset()); qDebug() << Q_FUNC_INFO << "OUT"; return OK; } tmp9balx013/SrcPony/lpt_io_interf.cpp0000644000175000017500000001247513616566001017675 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "errcode.h" #include #include #ifdef Q_OS_WIN32 #include #endif #ifdef Q_OS_LINUX #include #include #endif #include "lpt_io_interf.h" enum LptRegs { dataOfst, statOfst, ctrlOfst }; LPTIOInterface::LPTIOInterface() { qDebug() << "LPTIOInterface::LPTIOInterface()"; last_ctrl = last_data = 0; lpt_port = -1; //PortInterface::OpenParallel(lpt_port); } LPTIOInterface::~LPTIOInterface() { qDebug() << "LPTIOInterface::~LPTIOInterface()"; PortInterface::CloseParallel(); } void LPTIOInterface::SetPort(int port_no) { qDebug() << "LPTIOInterface::SetPort(" << port_no << ")"; if (port_no >= 0 && port_no < MAX_LPTPORTS) { lpt_port = port_no; PortInterface::CloseParallel(); PortInterface::OpenParallel(lpt_port); } } // Bit Bit // 0 - Unused 4 - Pin 13 // 1 - Unused 5 - Pin 12 // 2 - Unused 6 - Pin 10 // 3 - Pin 15 7 - Pin 11 (Inverted) // ///////////////////////////////////////////////////////////////// int LPTIOInterface::InDataPort(int port_no) { qDebug() << "LPTIOInterface::InDataPort(" << port_no << ") ** lp=" << lpt_port; int ret_val = OK; if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_port) { lpt_port = port_no; PortInterface::CloseParallel(); ret_val = PortInterface::OpenParallel(lpt_port); } if (ret_val == OK) { ret_val = PortInterface::InPort(statOfst); } qDebug() << "LPTIOInterface::InDataPort() = " << ret_val; return ret_val; } // // Bit Bit // 0 - Pin 2 4 - Pin 6 // 1 - Pin 3 5 - Pin 7 // 2 - Pin 4 6 - Pin 8 // 3 - Pin 5 7 - Pin 9 // ///////////////////////////////////////////////////////////////// int LPTIOInterface::OutDataPort(int val, int port_no) { qDebug() << "LPTIOInterface::OutDataPort(" << val << ", " << port_no << ")"; int ret_val = OK; if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_port) { lpt_port = port_no; PortInterface::CloseParallel(); ret_val = PortInterface::OpenParallel(lpt_port); } if (ret_val == OK) { last_data = val; ret_val = PortInterface::OutPort(val, dataOfst); } qDebug() << "LPTIOInterface::OutDataPort() = " << ret_val; return ret_val; } // // Bit // 0 - Pin 1 // 1 - Pin 14 // 2 - Pin 16 // 3 - Pin 17 NOTE: Bits 5-7 are not used. // ///////////////////////////////////////////////////////////////// int LPTIOInterface::OutControlPort(int val, int port_no) { qDebug() << "LPTIOInterface::OutControlPort(" << val << ", " << port_no << ")"; int ret_val = OK; if (port_no >= 0 && port_no < MAX_LPTPORTS && port_no != lpt_port) { lpt_port = port_no; PortInterface::CloseParallel(); ret_val = PortInterface::OpenParallel(lpt_port); } if (ret_val == OK) { last_ctrl = val; ret_val = PortInterface::OutPort(val, ctrlOfst); } qDebug() << "LPTIOInterface::OutControlPort() = " << ret_val; return ret_val; } int LPTIOInterface::OutDataMask(int mask, int val) { int ret_val; if (val == 0) { last_data &= ~mask; } else if (val == 1) { last_data |= mask; } else { last_data ^= mask; } ret_val = OutDataPort(last_data); return ret_val; } int LPTIOInterface::OutControlMask(int mask, int val) { int ret_val; if (val == 0) { last_ctrl &= ~mask; } else if (val == 1) { last_ctrl |= mask; } else { last_ctrl ^= mask; } ret_val = OutControlPort(last_ctrl); return ret_val; } tmp9balx013/SrcPony/e24xx-2.h0000644000175000017500000000514413616566001015611 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E24XX2_H #define _E24XX2_H #include "e24xx.h" class E24xx2 : public E24xx { public: E24xx2(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); // virtual ~E24xx2(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); // int BankRollOverDetect(int force); int SecurityRead(uint32_t &blocks); int SecurityWrite(uint32_t blocks); int HighEnduranceRead(uint32_t &block_no); int HighEnduranceWrite(uint32_t block_no); protected: private: int const SecurityReadCode; int const SecurityWriteCode; int const HEnduranceReadCode; int const HEnduranceWriteCode; }; #endif tmp9balx013/SrcPony/e2pfbuf.cpp0000644000175000017500000002127513616566001016367 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include #include "e2pfbuf.h" // Header file #include "crc.h" #include "errcode.h" #include "e2phead.h" #include "eeptypes.h" static char const *id_string = "E2P!Lanc"; e2pFileBuf::e2pFileBuf(e2AppWinInfo *wininfo) : FileBuf(wininfo) { file_type = E2P; Q_ASSERT_X(sizeof(struct e2pHeader) == 152, "e2pFileBuf", "Bad size for e2pHeader"); } e2pFileBuf::~e2pFileBuf() { } /*** void e2pFileBuf::check_offsets() { printf("fileID: %lu\n", offsetof(e2pHeader, fileID)); printf("e2pFuseBits: %lu\n", offsetof(e2pHeader, e2pFuseBits)); printf("e2pLockBits: %lu\n", offsetof(e2pHeader, e2pLockBits)); printf("e2pType: %lu\n", offsetof(e2pHeader, e2pType)); printf("e2pSize: %lu\n", offsetof(e2pHeader, e2pSize)); printf("flags: %lu\n", offsetof(e2pHeader, flags)); printf("e2pExtFuseBits: %lu\n", offsetof(e2pHeader, e2pExtFuseBits)); printf("e2pExtLockBits: %lu\n", offsetof(e2pHeader, e2pExtLockBits)); printf("fversion: %lu\n", offsetof(e2pHeader, fversion)); printf("split_size_Low: %lu\n", offsetof(e2pHeader, split_size_Low)); printf("e2pStringID: %lu\n", offsetof(e2pHeader, e2pStringID)); printf("e2pProgBits: %lu\n", offsetof(e2pHeader, e2pProgBits)); printf("e2pComment: %lu\n", offsetof(e2pHeader, e2pComment)); printf("split_size_High: %lu\n", offsetof(e2pHeader, split_size_High)); printf("pad: %lu\n", offsetof(e2pHeader, pad)); printf("e2pCrc: %lu\n", offsetof(e2pHeader, e2pCrc)); printf("headCrc: %lu\n", offsetof(e2pHeader, headCrc)); if (sizeof(struct e2pHeader) != 152) printf("Bad E2P Header size: %lu\n", sizeof(struct e2pHeader)); else printf("E2P Header size OK (%lu)\n", sizeof(struct e2pHeader)); } ***/ int e2pFileBuf::Load(int loadtype, long relocation_offset) { extern int GetE2PSubType(unsigned long x); extern int GetE2PPriType(unsigned long x); QFile fh(FileBuf::GetFileName()); e2pHeader hdr; int rval; if (!fh.open(QIODevice::ReadOnly)) { return FILENOTFOUND; } QDataStream datastream(&fh); // Controlla il tipo di file if (datastream.readRawData((char *)&hdr, sizeof(e2pHeader)) && strncmp(hdr.fileID, id_string, E2P_ID_SIZE) == 0) { unsigned char *localbuf = new unsigned char[hdr.e2pSize]; //Controlla il CRC dell'Header if (mcalc_crc(&hdr, sizeof(hdr) - sizeof(hdr.headCrc)) == hdr.headCrc && //Check for CRC in memory fcalc_crc(fh, sizeof(e2pHeader), 0) == hdr.e2pCrc && //read buffer datastream.readRawData((char *)localbuf, hdr.e2pSize)) // fread(FileBuf::GetBufPtr(), hdr.e2pSize, 1, fh) ) { SetEEpromType(hdr.e2pType); //set eeprom device type (and block size too) //FileBuf::SetNoOfBlock( hdr.e2pSize / FileBuf::GetBlockSize() ); if (hdr.fversion > 0) { SetLockBits(((uint32_t)hdr.e2pExtLockBits << 8) | hdr.e2pLockBits); SetFuseBits(((uint32_t)hdr.e2pExtFuseBits << 8) | hdr.e2pFuseBits); } else { //Old file version if (GetE2PPriType(hdr.e2pType) == PIC16XX || GetE2PPriType(hdr.e2pType) == PIC168XX || GetE2PPriType(hdr.e2pType) == PIC125XX) { SetLockBits(((uint32_t)hdr.e2pLockBits << 8) | hdr.e2pFuseBits); } else { SetLockBits(hdr.e2pLockBits); SetFuseBits(hdr.e2pFuseBits); } } if (hdr.fversion > 1) { SetSplitted(((uint32_t)hdr.split_size_High << 16) | hdr.split_size_Low); } else { SetSplitted(hdr.split_size_Low); } SetStringID(hdr.e2pStringID); SetComment(hdr.e2pComment); SetRollOver(hdr.flags & 7); SetCRC(hdr.e2pCrc); //Copy the content into the buffer if (loadtype == ALL_TYPE) { if (hdr.e2pSize <= GetBufSize()) { memcpy(FileBuf::GetBufPtr(), localbuf, hdr.e2pSize); } } else if (loadtype == PROG_TYPE) { long s = GetSplitted(); if (s <= 0) { s = hdr.e2pSize; } //if splittedInfo == 0 then copy ALL if (s <= hdr.e2pSize && s <= GetBufSize()) { memcpy(FileBuf::GetBufPtr(), localbuf, s); } } else if (loadtype == DATA_TYPE) { long s = GetSplitted(); if (s >= 0 && s < hdr.e2pSize && hdr.e2pSize <= GetBufSize()) { memcpy(FileBuf::GetBufPtr() + s, localbuf + s, hdr.e2pSize - s); } } rval = GetNoOfBlock(); } else { rval = READERROR; } delete[] localbuf; } else { rval = BADFILETYPE; } fh.close(); return rval; } int e2pFileBuf::Save(int savetype, long relocation_offset) { e2pHeader hdr; int rval; if (FileBuf::GetNoOfBlock() <= 0) { return NOTHINGTOSAVE; } QFile fh(FileBuf::GetFileName()); //Header settings memset(&hdr, 0, sizeof(hdr)); //Clear all to zero first strncpy(hdr.fileID, id_string, E2P_ID_SIZE); //Id hdr.e2pSize = FileBuf::GetNoOfBlock() * FileBuf::GetBlockSize(); unsigned char *localbuf = new unsigned char[hdr.e2pSize]; long s = GetSplitted(); memset(localbuf, 0xff, hdr.e2pSize); if (fh.exists()) { if (!fh.open(QIODevice::ReadOnly)) { delete[] localbuf; return CREATEERROR; } QDataStream datastream(&fh); //Initialize local buffer // if the file already exist read the current content // otherwise set the localbuffer to 0xFF if (fh.seek(sizeof(hdr))) { datastream.readRawData((char *)localbuf, hdr.e2pSize); } fh.close(); } if (savetype == ALL_TYPE) { memcpy(localbuf, FileBuf::GetBufPtr(), hdr.e2pSize); } else if (savetype == DATA_TYPE) { if (hdr.e2pSize > s) { memcpy(localbuf + s, FileBuf::GetBufPtr() + s, hdr.e2pSize - s); } } else if (savetype == PROG_TYPE) { if (s > 0 && s <= hdr.e2pSize) { memcpy(localbuf, FileBuf::GetBufPtr(), s); } } hdr.fversion = E2P_FVERSION; hdr.e2pLockBits = (uint8_t)(GetLockBits() & 0xFF); hdr.e2pExtLockBits = (uint16_t)(GetLockBits() >> 8); hdr.e2pFuseBits = (uint8_t)(GetFuseBits() & 0xFF); hdr.e2pExtFuseBits = (uint16_t)(GetFuseBits() >> 8); hdr.e2pType = GetEEpromType(); strncpy(hdr.e2pStringID, GetStringID().toLatin1().constData(), 28); strncpy(hdr.e2pComment, GetComment().toLatin1().constData(), 85); hdr.flags = GetRollOver() & 7; hdr.split_size_Low = (uint16_t)GetSplitted(); hdr.split_size_High = (uint16_t)(GetSplitted() >> 16); hdr.e2pCrc = mcalc_crc(localbuf, hdr.e2pSize); hdr.headCrc = mcalc_crc(&hdr, sizeof(hdr) - sizeof(hdr.headCrc)); if (fh.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QDataStream datastream(&fh); //Write to file if (datastream.writeRawData((char *)&hdr, sizeof(hdr)) && //Write the header datastream.writeRawData((char *)localbuf, hdr.e2pSize)) //Write the buffer { rval = GetNoOfBlock(); } else { rval = WRITEERROR; } fh.close(); } else { rval = CREATEERROR; } delete[] localbuf; return rval; } tmp9balx013/SrcPony/sernumdlg.h0000644000175000017500000000573313616566001016504 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef SerNumDIALOG_H #define SerNumDIALOG_H #include "ui_osccalibr.h" #include "ui_sernumcfg.h" #include #include #include "Translator.h" #include "types.h" #include "e2profil.h" #include "e2awinfo.h" class SerNumDialog : public QDialog, public cTranslator, public Ui::SNCfgDialog { Q_OBJECT public: SerNumDialog(QWidget *bw, const QString title = translate(STR_MSGSERNUMCFG)); virtual ~SerNumDialog(); // Destructor private slots: void onOk(); protected: private: void setTextWidgets(); private: long loc; unsigned long val; bool memtype; bool autoinc; int size; FmtEndian fmt; }; class OscCalibDialog : public QDialog, public cTranslator, public Ui::OscCalibrDialog { Q_OBJECT public: OscCalibDialog(QWidget *bw, e2AppWinInfo *aw, const QString title = translate(STR_MSGOSCCALIBCFG)); virtual ~OscCalibDialog(); // Destructor private slots: void onOk(); void onRead(); protected: private: long loc; int val; bool memtype; bool enabled; int size; e2AppWinInfo *awip; }; #endif tmp9balx013/SrcPony/at90sbus.cpp0000644000175000017500000004716113616566001016512 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at90sbus.h" #include "errcode.h" #include "eeptypes.h" #include #include "e2cmdw.h" //Pay attention that Intel Hex format is Little Endian #undef _BIG_ENDIAN_ // Constructor At90sBus::At90sBus(BusInterface *ptr) : SPIBus(ptr), EnableProg0(0xAC), EnableProg1(0x53), ChipErase0(0xAC), ChipErase1(0x80), ReadProgMemH0(0x28), ReadProgMemH1(0), ReadProgMemL0(0x20), ReadProgMemL1(0), WriteProgMemH0(0x48), WriteProgMemH1(0), WriteProgMemL0(0x40), WriteProgMemL1(0), WriteProgPageMem(0x4C), ReadEEPMem0(0xA0), ReadEEPMem1(0), WriteEEPMem0(0xC0), WriteEEPMem1(0), ReadDevCode0(0x30), ReadDevCode1(0), ReadLock0(0x58), ReadLock1(0), WriteLock0(0xAC), WriteLock1(0xE0), ReadFuse0(0x50), ReadFuse1(0), WriteFuse0(0xAC), WriteFuse1a(0xBF), WriteFuse1b(0xA0), ReadFuseHigh0(0x58), ReadFuseHigh1(0x08), WriteFuseHigh0(0xAC), WriteFuseHigh1(0xA8), ReadFuseExt0(0x50), ReadFuseExt1(0x08), WriteFuseExt0(0xAC), WriteFuseExt1(0xA4), ReadCalib0(0x38), ReadCalib1(0), p1_a(0x80), p2_a(0x7F), pflash_a(0x7F), p1_b(0x00), p2_b(0xFF), pflash_b(0xFF), old1200mode(false), enable_flashpage_polling(false) { qDebug() << Q_FUNC_INFO; //With this values the AVR can be programmed even at low voltage (3.2V) twd_erase = 30; twd_prog = 10; } //limit EEPROM size to 64K max int At90sBus::ReadEEPByte(long addr) { SendDataByte(ReadEEPMem0); SendDataByte(ReadEEPMem1 | ((addr & 0xFFFF) >> 8)); //19/01/1999 -- the bug is due to an error in the original Atmel datasheet SendDataByte(addr); return RecDataByte(); } void At90sBus::WriteEEPByte(long addr, int data) { SendDataByte(WriteEEPMem0); SendDataByte(WriteEEPMem1 | ((addr & 0xFFFF) >> 8)); //19/01/1999 SendDataByte(addr); SendDataByte(data); } int At90sBus::ReadProgByte(long addr) { int lsb = addr & 1; addr >>= 1; //convert to word address //Se fosse little-endian sarebbe l'inverso #ifdef _BIG_ENDIAN_ if (!lsb) #else if (lsb) #endif { SendDataByte(ReadProgMemH0); SendDataByte(ReadProgMemH1 | (addr >> 8)); } else { SendDataByte(ReadProgMemL0); SendDataByte(ReadProgMemL1 | (addr >> 8)); } SendDataByte(addr); return RecDataByte(); } void At90sBus::WriteProgByte(long addr, int data) { SetLastProgrammedAddress(addr); int lsb = addr & 1; addr >>= 1; //convert to word address //Se fosse little-endian sarebbe l'inverso #ifdef _BIG_ENDIAN_ if (!lsb) #else if (lsb) #endif { SendDataByte(WriteProgMemH0); SendDataByte(WriteProgMemH1 | (addr >> 8)); } else { SendDataByte(WriteProgMemL0); SendDataByte(WriteProgMemL1 | (addr >> 8)); } SendDataByte(addr); SendDataByte(data); } int At90sBus::Reset() { bool success_flag = false; qDebug() << Q_FUNC_INFO << "I"; RefreshParameters(); if (old1200mode) { int k; for (k = 0; k < 4 && !success_flag; k++) { SPIBus::Reset(); WaitMsec(E2Profile::GetAVRDelayAfterReset()); // At least 20msec (AVR datasheets) qDebug() << Q_FUNC_INFO << "() ** SendDataByte"; SendDataByte(EnableProg0); SendDataByte(EnableProg1); RecDataByte(); SendDataByte(0); if (ReadDeviceCode(0) == 0x1E) { success_flag = true; } } } else { int j; for (j = 0; j < 4 && !success_flag; j++) { SPIBus::Reset(); WaitMsec(E2Profile::GetAVRDelayAfterReset()); // At least 20msec (AVR datasheets) for (int k = 0; k < 32 && !success_flag; k++) { qDebug() << Q_FUNC_INFO << "() ** SendEnableProg"; SendDataByte(EnableProg0); SendDataByte(EnableProg1); int val = RecDataByte(); SendDataByte(0); if (val != EnableProg1) //Echo expected { RecDataBit(); //Give a pulse on SCK (as AVR datasheets suggest) } else { success_flag = true; } } } } return success_flag ? 1 : 0; } int At90sBus::WriteLockBits(uint32_t param, long model) { int val1, val2, val3, val4; int val5, val6, val7, val8; val1 = -1; val2 = val3 = val4 = 0; val5 = -1; val6 = val7 = val8 = 0; switch (model) { case AT90S1200: case AT90S2313: case AT90S4414: case AT90S8515: case AT90S2323: case AT90S2343: case AT90S2333: case AT90S4433: case AT90S4434: case AT90S8535: case ATmega603: case ATmega103: case ATtiny12: case ATtiny15: case ATtiny22: val1 = WriteLock0; val2 = ~(param & 0x06); break; case ATtiny2313: case ATtiny4313: // new ATtiny4313 16.09.2015 @RG case ATtiny26: case ATtiny13: case ATtiny24: case ATtiny44: case ATtiny84: //new 08.01.2015 @RG case ATtiny25: case ATtiny45: case ATtiny85: case ATtiny261: case ATtiny461: case ATtiny861: val1 = WriteLock0; val2 = WriteLock1; // val4 = ~(param & 0x03); break; case ATmega8: case ATmega16: case ATmega161: case ATmega163: case ATmega323: case ATmega128: case ATmega64: case ATmega32: case ATmega162: case ATmega169: case ATmega8515: case ATmega8535: case ATmega48: case ATmega88: case ATmega168: case ATmega328: // new ATmega328 (RG 22.06.2012) case ATmega164: case ATmega324: case ATmega644: case ATmega1284: // new ATmega1284P (RG 10.06.2017) case ATmega640: case ATmega1280: case ATmega1281: case ATmega2560: case ATmega2561: case AT90CAN32: case AT90CAN64: case AT90CAN128: val1 = WriteLock0; val2 = WriteLock1; // val4 = ~(param & 0x3F); break; //Only Parallel programming case AT90S8534: default: //No Locks break; } if (val1 != -1) { SendDataByte(val1); SendDataByte(val2); SendDataByte(val3); SendDataByte(val4); WaitMsec(twd_prog * 10); } if (val5 != -1) { SendDataByte(val5); SendDataByte(val6); SendDataByte(val7); SendDataByte(val8); WaitMsec(twd_prog * 10); } return OK; } int At90sBus::WriteFuseBits(uint32_t param, long model) { int val1, val2, val3, val4; int val5, val6, val7, val8; int val9, valA, valB, valC; val1 = -1; val2 = val3 = val4 = 0; val5 = -1; val6 = val7 = val8 = 0; val9 = -1; valA = valB = valC = 0; switch (model) { case AT90S2323: case AT90S2343: case AT90S4434: case AT90S8535: val1 = WriteFuse0; val2 = WriteFuse1a & ~(param & 1); break; case ATmega603: case ATmega103: val1 = WriteFuse0; val2 = WriteFuse1a & ~(param & 0x0B); break; case AT90S2333: case AT90S4433: val1 = WriteFuse0; val2 = WriteFuse1a & ~(param & 0x1F); break; //One byte fuse case ATtiny12: case ATtiny15: case ATmega161: val1 = WriteFuse0; val2 = WriteFuse1b; // val4 = ~(param & 0xFF); break; //Two byte fuse case ATtiny13: case ATtiny26: case ATmega163: case ATmega323: case ATmega8: case ATmega16: case ATmega32: case ATmega8515: case ATmega8535: val1 = WriteFuse0; val2 = WriteFuse1b; // val4 = ~(param & 0xFF); val5 = WriteFuseHigh0; val6 = WriteFuseHigh1; // val8 = ~((param >> 8) & 0xFF); break; //Three byte fuse case ATtiny2313: case ATtiny4313: // new ATtiny4313 16.09.2015 @RG case ATtiny24: case ATtiny44: case ATtiny84: // new 08.01.2015 @RG case ATtiny25: case ATtiny45: case ATtiny85: case ATtiny261: case ATtiny461: case ATtiny861: case ATmega128: case ATmega64: case ATmega162: case ATmega169: case ATmega48: case ATmega88: case ATmega168: case ATmega328: // new ATmega328 (RG 22.06.2012) case ATmega164: case ATmega324: case ATmega644: case ATmega1284: // new ATmega1284P (RG 10.06.2017) case AT90CAN32: case AT90CAN64: case AT90CAN128: case ATmega640: case ATmega1280: case ATmega1281: case ATmega2560: case ATmega2561: val1 = WriteFuse0; val2 = WriteFuse1b; // val4 = ~(param & 0xFF); val5 = WriteFuseHigh0; val6 = WriteFuseHigh1; // val8 = ~((param >> 8) & 0xFF); val9 = WriteFuseExt0; valA = WriteFuseExt1; // valC = ~((param >> 16) & 0xFF); break; //No fuses case AT90S1200: case AT90S2313: case AT90S4414: case AT90S8515: case ATtiny22: case AT90S8534: default: //No Fuses break; } if (val1 != -1) { SendDataByte(val1); SendDataByte(val2); SendDataByte(val3); SendDataByte(val4); WaitMsec(twd_prog * 10); } if (val5 != -1) { SendDataByte(val5); SendDataByte(val6); SendDataByte(val7); SendDataByte(val8); WaitMsec(twd_prog * 10); } if (val9 != -1) { SendDataByte(val9); SendDataByte(valA); SendDataByte(valB); SendDataByte(valC); WaitMsec(twd_prog * 10); } return OK; } uint32_t At90sBus::ReadFuseBits(long model) { uint32_t retval = 0; uint32_t rv1, rv2, rv3; switch (model) { case ATtiny22: SendDataByte(ReadLock0); //NB Read LOCK!! SendDataByte(ReadLock1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0x20; break; case AT90S2323: case AT90S2343: case AT90S4434: case AT90S8535: SendDataByte(ReadLock0); //NB Read LOCK!! SendDataByte(ReadLock1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0x21; break; //One byte fuse case AT90S2333: case AT90S4433: case ATmega603: case ATmega103: case ATtiny12: case ATtiny15: case ATmega161: SendDataByte(ReadFuse0); SendDataByte(ReadFuse1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0xFF; break; //Two byte fuse case ATtiny13: case ATtiny26: case ATmega163: case ATmega323: case ATmega8: case ATmega16: case ATmega32: case ATmega8515: case ATmega8535: SendDataByte(ReadFuse0); SendDataByte(ReadFuse1); SendDataByte(0); rv1 = RecDataByte(); rv1 = ~rv1 & 0xFF; SendDataByte(ReadFuseHigh0); SendDataByte(ReadFuseHigh1); SendDataByte(0); rv2 = RecDataByte(); rv2 = ~rv2 & 0xFF; retval = (rv2 << 8) | rv1; break; //Three byte fuse case ATtiny2313: case ATtiny4313: // new ATtiny4313 16.09.2015 @RG case ATtiny24: case ATtiny44: case ATtiny84: // new 08.01.2015 @RG case ATtiny25: case ATtiny45: case ATtiny85: case ATtiny261: case ATtiny461: case ATtiny861: case ATmega128: case ATmega64: case ATmega162: case ATmega169: case ATmega48: case ATmega88: case ATmega168: case ATmega328: // new ATmega328 (RG 22.06.2012) case ATmega164: case ATmega324: case ATmega644: case ATmega1284: // new ATmega1284 (RG 10.06.2017) case AT90CAN32: case AT90CAN64: case AT90CAN128: case ATmega640: case ATmega1280: case ATmega1281: case ATmega2560: case ATmega2561: SendDataByte(ReadFuse0); SendDataByte(ReadFuse1); SendDataByte(0); rv1 = RecDataByte(); rv1 = ~rv1 & 0xFF; SendDataByte(ReadFuseHigh0); SendDataByte(ReadFuseHigh1); SendDataByte(0); rv2 = RecDataByte(); rv2 = ~rv2 & 0xFF; SendDataByte(ReadFuseExt0); SendDataByte(ReadFuseExt1); SendDataByte(0); rv3 = RecDataByte(); rv3 = ~rv3 & 0xFF; retval = (rv3 << 16) | (rv2 << 8) | rv1; break; //No fuses case AT90S1200: case AT90S2313: case AT90S4414: case AT90S8515: default: //No Fuses break; } return retval; } uint32_t At90sBus::ReadLockBits(long model) { uint32_t retval = 0; int rv1, rv2; switch (model) { case AT90S1200: case AT90S2313: case AT90S4414: case AT90S8515: //No read locks command int code[3]; code[0] = ReadDeviceCode(0); code[1] = ReadDeviceCode(1); code[2] = ReadDeviceCode(2); if (code[0] == 0x00 && code[1] == 0x01 && code[2] == 0x02) { retval = 0x06; //both lock bits programmed } break; case ATtiny22: case AT90S2323: case AT90S2343: case AT90S4434: case AT90S8535: SendDataByte(ReadLock0); SendDataByte(ReadLock1); SendDataByte(0); rv2 = rv1 = RecDataByte(); rv1 = ~rv1 & 0x80; rv2 = ~rv2 & 0x40; retval = (rv1 >> 6) | (rv2 >> 4); break; case ATtiny12: case ATtiny15: case AT90S2333: case AT90S4433: case ATmega603: case ATmega103: SendDataByte(ReadLock0); SendDataByte(ReadLock1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0x06; break; case ATtiny13: case ATtiny26: case ATtiny2313: case ATtiny4313: // new ATtiny4313 16.09.2015 @RG case ATtiny24: case ATtiny44: case ATtiny84: // new 08.01.2015 @RG case ATtiny25: case ATtiny45: case ATtiny85: case ATtiny261: case ATtiny461: case ATtiny861: SendDataByte(ReadLock0); SendDataByte(ReadLock1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0x03; break; case ATmega8: case ATmega16: case ATmega161: case ATmega163: case ATmega323: case ATmega128: case ATmega64: case ATmega32: case ATmega162: case ATmega169: case ATmega8515: case ATmega8535: case ATmega48: case ATmega88: case ATmega168: case ATmega328: // new ATmega328 (RG 22.06.2012) case ATmega164: case ATmega324: case ATmega644: case ATmega1284: // new ATmega1284 (RG 10.06.2017) case AT90CAN32: case AT90CAN64: case AT90CAN128: case ATmega640: case ATmega1280: case ATmega1281: case ATmega2560: case ATmega2561: SendDataByte(ReadLock0); SendDataByte(ReadLock1); SendDataByte(0); rv1 = RecDataByte(); retval = ~rv1 & 0x3F; break; default: //No locks break; } return retval; } int At90sBus::ReadDeviceCode(int addr) { SendDataByte(ReadDevCode0); SendDataByte(ReadDevCode1); SendDataByte(addr & 3); return RecDataByte(); } long At90sBus::ReadCalibration(int addr) { SendDataByte(ReadCalib0); SendDataByte(ReadCalib1); SendDataByte(addr & 3); return RecDataByte(); } long At90sBus::Read(int addr, uint8_t *data, long length, int page_size) { long len; ReadStart(); //int code[3]; //code[0] = ReadDeviceCode(0); //code[1] = ReadDeviceCode(1); //code[2] = ReadDeviceCode(2); if (addr) { //EEprom addr = 0; for (len = 0; len < length; len++) { *data++ = (uint8_t)ReadEEPByte(addr++); if (ReadProgress(len * 100 / length)) { break; } } } else { //Flash Eprom addr = 0; for (len = 0; len < length; len++) { *data++ = (uint8_t)ReadProgByte(addr++); if (ReadProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush() ReadEnd(); return len; } int At90sBus::WaitReadyAfterWrite(int type, long addr, int data, long timeout) { int rval; if (old1200mode) { rval = OK; WaitMsec(twd_prog); } else { if (type) { //EEprom if (data == p1_a || data == p2_a || data == p1_b || data == p2_b) { rval = OK; WaitMsec(twd_prog); } else { rval = E2P_TIMEOUT; int k; for (k = 0; k < timeout; k++) { int val = ReadEEPByte(addr); if (val == data) { rval = OK; break; } } } } else { //Flash if (data == pflash_a || data == pflash_b) { rval = OK; WaitMsec(twd_prog); } else { rval = E2P_TIMEOUT; int k; for (k = 0; k < timeout; k++) { int val = ReadProgByte(addr); if (val == data) { rval = OK; break; } } } } } return rval; } //11/09/99 int At90sBus::Erase(int type) { EraseStart(); //Erase command SendDataByte(ChipErase0); SendDataByte(ChipErase1); SendDataByte(0); SendDataByte(0); WaitMsec(twd_erase); Reset(); /** Needed by ATtiny12 **/ WriteProgByte(0, 0xFF); WaitMsec(twd_prog); //Erase command SendDataByte(ChipErase0); SendDataByte(ChipErase1); SendDataByte(0); SendDataByte(0); WaitMsec(twd_erase); Reset(); EraseEnd(); return OK; } long At90sBus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); if (addr) { //EEprom for (addr = 0, len = 0; len < length; addr++, data++, len++) { //09/10/98 -- program only locations that really need to be programmed int val = ReadEEPByte(addr); if (val != *data) { WriteEEPByte(addr, *data); WaitUsec(100); //Interrupt the writing and exit (device missing?) if (WaitReadyAfterWrite(1, addr, *data) != OK) { return E2ERR_WRITEFAILED; } } if (WriteProgress(len * 100 / length)) { break; } } } else { //Flash Eprom if (page_size > 1) { //Flash Eprom with page write for (addr = 0, len = 0; len < length; addr += page_size, data += page_size, len += page_size) { //check for FF's page to skip blank pages if (!CheckBlankPage(data, page_size)) if (WriteProgPage(addr, data, page_size) != OK) { return E2ERR_WRITEFAILED; } if (WriteProgress(len * 100 / length)) { break; } } } else { for (addr = 0, len = 0; len < length; addr++, data++, len++) { //09/10/98 -- program only locations not equal to FF (erase set all FF) if (*data != 0xFF) { WriteProgByte(addr, *data); WaitUsec(100); if (WaitReadyAfterWrite(0, addr, *data, 2000) != OK) { return E2ERR_WRITEFAILED; } } if (WriteProgress(len * 100 / length)) { break; } } } } WaitMsec(1); //Flush() WriteEnd(); return len; } void At90sBus::RefreshParameters() { twd_prog = E2Profile::GetAVRProgDelay(); twd_erase = E2Profile::GetAVREraseDelay(); } bool At90sBus::GetFlashPagePolling() const { return enable_flashpage_polling; } void At90sBus::SetFlashPagePolling(bool val) { enable_flashpage_polling = val; } int At90sBus::WriteProgPage(long addr, uint8_t const *data, long page_size, long timeout) { long k; bool okflag; long first_loc = -1; //first location different from 0xFF if (page_size <= 0 || data == NULL) { return BADPARAM; } //align addr to page boundary addr &= ~(page_size - 1); //0xFFFFFF00 for (k = 0; k < page_size; k++, data++) { if (first_loc < 0 && *data != 0xFF) { first_loc = addr + k; } WriteProgByte(k, *data); } SendDataByte(WriteProgPageMem); SendDataByte(addr >> 9); //send word address SendDataByte(addr >> 1); SendDataByte(0); SetLastProgrammedAddress(addr + page_size - 1); if (enable_flashpage_polling) { WaitUsec(100); okflag = false; for (k = timeout; k > 0; k--) { if (ReadProgByte(first_loc) != 0xFF) { okflag = true; break; } } } else { okflag = true; WaitMsec(E2Profile::GetMegaPageDelay()); } return okflag ? OK : E2P_TIMEOUT; } bool At90sBus::CheckBlankPage(uint8_t const *data, long length) { bool blank_page = true; while (length--) { if (*data++ != 0xFF) { blank_page = false; break; } } return blank_page; } tmp9balx013/SrcPony/at250bus2.cpp0000644000175000017500000000717013616566001016463 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at250bus2.h" #include "errcode.h" #include #include #include "e2cmdw.h" At250BigBus::At250BigBus(BusInterface *ptr) : At250Bus(ptr) { qDebug() << Q_FUNC_INFO << "(" << (hex) << ptr << (dec) << ")"; } long At250BigBus::Read(int addr, uint8_t *data, long length, int page_size) { qDebug() << Q_FUNC_INFO << "(" << (hex) << addr << ", " << data << ", " << (dec) << length << ")"; ReadStart(); long len; SendDataByte(ReadData); SendDataByte((addr >> 8) & 0xFF); //MSB SendDataByte(addr & 0xFF); //LSB ShotDelay(); for (len = 0; len < length; len++) { *data++ = RecDataByte(); if ((len % 10) == 0) { if (ReadProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush EndCycle(); ReadEnd(); qDebug() << Q_FUNC_INFO << "=" << len; return len; } long At250BigBus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); int writepage_size = E2Profile::GetSPIPageWrite(); WriteEEPStatus(0); // 07/08/99 *** bug fix suggested by Atmel Product engineer if (!WaitEndOfWrite()) { return 0; } long count = 0; for (len = 0; len < length; len += writepage_size, addr += writepage_size) { SendDataByte(WriteEnable); EndCycle(); SendDataByte(WriteData); SendDataByte((addr >> 8) & 0xFF); //MSB SendDataByte(addr & 0xFF); //LSB int j; for (j = 0; j < writepage_size; j++) { SendDataByte(*data++); } EndCycle(); if (!WaitEndOfWrite()) { return 0; //Must return 0, because > 0 (and != length) means "Abort by user" } if ((++count & 1)) { if (WriteProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush WriteEnd(); return len; } tmp9balx013/SrcPony/version.h.in0000644000175000017500000000065413616566001016573 0ustar carstencarsten#ifndef PONYPROGVERSION_H #define PONYPROGVERSION_H #ifndef APP_VERSION #define APP_VERSION "@PONYPROG_VERSION@" #endif #ifndef APP_AUTHOR #define APP_AUTHOR "@PONYPROG_AUTHOR@" #endif #ifndef PROGRAM_DATE #define PROGRAM_DATE "@BUILD_DATE@" #endif #ifndef APP_NAME #define APP_NAME "@PROJECT_NAME@" #endif #ifndef APP_EMAIL #define APP_EMAIL "@PROJECT_EMAIL@" #endif #define USE_QT_VERSION @USE_QT_VERSION@ #endif tmp9balx013/SrcPony/globals.h0000644000175000017500000000624313616566001016124 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // Some global ID and #defines #ifndef _GLOBALS_H #define _GLOBALS_H #define AUTOSIZE_ID 64768 #define PROG_TYPE 0x1 #define DATA_TYPE 0x2 #define CONFIG_TYPE 0x4 #define ALL_TYPE 0x7 // (PROG_TYPE|DATA_TYPE|CONFIG_TYPE) #define NO_OF_FILETYPE LAST_FT enum FileType { E2P, INTEL, MOTOS, BIN, CSM, LAST_FT }; // #define NO_OF_INTERFACETYPE (LAST_HT-1) enum HInterfaceType { //AutoTag //Interface Identification SIPROG_API = 0, SIPROG_IO, JDM_API, AVRISP, AVRISP_IO, EASYI2C_API, EASYI2C_IO, DT006_API, DT006_IO, LINUXSYSFS_IO, FTDI_JTAGKEY, PONYPROG_FT, //PONYPROG_RPI, LAST_HT }; #define NO_OF_BUSTYPE (LAST_BT-1) enum BusType { //AutoTag //Bus Type Identification I2C = 1, AT90S, //ATMEGAB, //AT1200S, AT89S, AT93C, AT250, AT250BIG, PICB, //SXB, SDEB, PICNEWB, IMBUS, PIC12B, X2444B, S2430B, LAST_BT }; class VidPid { public: VidPid(unsigned int _vid = 0, unsigned int _pid = 0) { vid = _vid; pid = _pid; } VidPid(const VidPid &p2) { vid = p2.vid; pid = p2.pid; } bool operator==(const VidPid &a) { return (a.pid == pid && a.vid == vid); } VidPid &operator=(const VidPid &a) { vid = a.vid; pid = a.pid; return *this; } unsigned int vid; unsigned int pid; }; #endif tmp9balx013/SrcPony/e2phead.h0000644000175000017500000000537713616566001016020 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // Header structure for .E2P files #ifndef _E2PHEAD_H #define _EP2HEAD_H #include #include #include "types.h" #define E2P_ID_SIZE 8 #define E2P_STRID_SIZE 28 #define E2P_COMM_SIZE 86 #define E2P_FVERSION 0x02 #ifdef Q_OS_WIN32 #pragma pack(push,1) #endif // Header dei file struct e2pHeader { char fileID[E2P_ID_SIZE]; uint8_t e2pFuseBits; uint8_t e2pLockBits; uint32_t e2pType; int32_t e2pSize; uint8_t flags; //rollOver, splitted uint16_t e2pExtFuseBits; uint16_t e2pExtLockBits; uint8_t fversion; //file version uint16_t split_size_Low; //used by splitted devices char e2pStringID[E2P_STRID_SIZE]; uint32_t e2pProgBits; char e2pComment[E2P_COMM_SIZE]; uint16_t split_size_High; uint16_t pad; uint16_t e2pCrc; uint16_t headCrc; } PACK; #ifdef Q_OS_WIN32 #pragma pack(pop) #endif #endif tmp9balx013/SrcPony/CMakeLists.txt0000644000175000017500000002412413616566001017066 0ustar carstencarsten#CMakeLists.txt SET(PONY_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/aboutmdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/usbwatcher.cpp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Translator.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2app.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at25xxx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at93cbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/crc.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e24xx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-5.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2profil.cpp ${CMAKE_CURRENT_SOURCE_DIR}/fusemdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/bitfield.cpp ${CMAKE_CURRENT_SOURCE_DIR}/blockmdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/intfbuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/lpt_io_interf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pgminter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/picbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/progoption.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sernumdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/x2444.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at17xxx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at89sbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at93cxx8.cpp ${CMAKE_CURRENT_SOURCE_DIR}/csmfbuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2cmdw.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2awinfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/easyi2c_interf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/i2cbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ispinterf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/microbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pic125xx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/picbusnew.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/retrymdlg.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/ch341a.cpp ${CMAKE_CURRENT_SOURCE_DIR}/spi-bus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at250bus2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at89sxx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at93cxx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/device.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/e2cnv.cpp ${CMAKE_CURRENT_SOURCE_DIR}/eeptypes.cpp ${CMAKE_CURRENT_SOURCE_DIR}/imbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/linuxsysfsint.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/modaldlg_utilities.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pic12bus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ponyioint.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rs232int.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/sxbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at250bus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at90sbus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/binfbuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/dt006interf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2dlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filebuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/infomdlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/lpt_ext_interf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mpsse_interf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/motsfbuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pic168xx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/portint.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sde2506.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wait.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at250xx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/at90sxx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/busio.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2401.cpp ${CMAKE_CURRENT_SOURCE_DIR}/e2pfbuf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/filldlg.cpp ${CMAKE_CURRENT_SOURCE_DIR}/interfconv.cpp ${CMAKE_CURRENT_SOURCE_DIR}/lptinterf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nvm3060.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pic16xx.cpp ${CMAKE_CURRENT_SOURCE_DIR}/x2444bus.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/profile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/prefdialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sdebus.cpp) SET(PONY_NOMOC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/e2app.h ${CMAKE_CURRENT_SOURCE_DIR}/e2awinfo.h ${CMAKE_CURRENT_SOURCE_DIR}/Translator.h ${CMAKE_CURRENT_SOURCE_DIR}/globals.h ${CMAKE_CURRENT_SOURCE_DIR}/device.h ${CMAKE_CURRENT_SOURCE_DIR}/microbus.h ${CMAKE_CURRENT_SOURCE_DIR}/at25xxx.h ${CMAKE_CURRENT_SOURCE_DIR}/at93cbus.h ${CMAKE_CURRENT_SOURCE_DIR}/busio.h ${CMAKE_CURRENT_SOURCE_DIR}/dt006interf.h ${CMAKE_CURRENT_SOURCE_DIR}/e24xx.h ${CMAKE_CURRENT_SOURCE_DIR}/eeptypes.h ${CMAKE_CURRENT_SOURCE_DIR}/ispinterf.h ${CMAKE_CURRENT_SOURCE_DIR}/lpt_io_interf.h ${CMAKE_CURRENT_SOURCE_DIR}/mpsse_interf.h ${CMAKE_CURRENT_SOURCE_DIR}/pgminter.h ${CMAKE_CURRENT_SOURCE_DIR}/picbus.h ${CMAKE_CURRENT_SOURCE_DIR}/sde2506.h ${CMAKE_CURRENT_SOURCE_DIR}/at17xxx.h ${CMAKE_CURRENT_SOURCE_DIR}/at89sbus.h ${CMAKE_CURRENT_SOURCE_DIR}/at93cxx8.h ${CMAKE_CURRENT_SOURCE_DIR}/e2401.h ${CMAKE_CURRENT_SOURCE_DIR}/e2pfbuf.h ${CMAKE_CURRENT_SOURCE_DIR}/errcode.h ${CMAKE_CURRENT_SOURCE_DIR}/i2cbus.h ${CMAKE_CURRENT_SOURCE_DIR}/jdminter.h ${CMAKE_CURRENT_SOURCE_DIR}/pic125xx.h ${CMAKE_CURRENT_SOURCE_DIR}/picbusnew.h ${CMAKE_CURRENT_SOURCE_DIR}/sdebus.h ${CMAKE_CURRENT_SOURCE_DIR}/types.h ${CMAKE_CURRENT_SOURCE_DIR}/at250bus2.h ${CMAKE_CURRENT_SOURCE_DIR}/at89sxx.h ${CMAKE_CURRENT_SOURCE_DIR}/at93cxx.h ${CMAKE_CURRENT_SOURCE_DIR}/crc.h ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-1.h ${CMAKE_CURRENT_SOURCE_DIR}/e2phead.h ${CMAKE_CURRENT_SOURCE_DIR}/filebuf.h ${CMAKE_CURRENT_SOURCE_DIR}/imbus.h ${CMAKE_CURRENT_SOURCE_DIR}/linuxsysfsint.h ${CMAKE_CURRENT_SOURCE_DIR}/pic12bus.h ${CMAKE_CURRENT_SOURCE_DIR}/ponyioint.h ${CMAKE_CURRENT_SOURCE_DIR}/resource.h ${CMAKE_CURRENT_SOURCE_DIR}/wait.h ${CMAKE_CURRENT_SOURCE_DIR}/at250bus.h ${CMAKE_CURRENT_SOURCE_DIR}/at90sbus.h ${CMAKE_CURRENT_SOURCE_DIR}/binfbuf.h ${CMAKE_CURRENT_SOURCE_DIR}/csmfbuf.h ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-2.h ${CMAKE_CURRENT_SOURCE_DIR}/e2profil.h ${CMAKE_CURRENT_SOURCE_DIR}/lpt_ext_interf.h ${CMAKE_CURRENT_SOURCE_DIR}/motsfbuf.h ${CMAKE_CURRENT_SOURCE_DIR}/pic168xx.h ${CMAKE_CURRENT_SOURCE_DIR}/portint.h ${CMAKE_CURRENT_SOURCE_DIR}/spi-bus.h ${CMAKE_CURRENT_SOURCE_DIR}/x2444bus.h ${CMAKE_CURRENT_SOURCE_DIR}/at250xx.h ${CMAKE_CURRENT_SOURCE_DIR}/at90sxx.h ${CMAKE_CURRENT_SOURCE_DIR}/businter.h ${CMAKE_CURRENT_SOURCE_DIR}/e24xx-5.h ${CMAKE_CURRENT_SOURCE_DIR}/easyi2c_interf.h ${CMAKE_CURRENT_SOURCE_DIR}/intfbuf.h ${CMAKE_CURRENT_SOURCE_DIR}/lptinterf.h ${CMAKE_CURRENT_SOURCE_DIR}/nvm3060.h ${CMAKE_CURRENT_SOURCE_DIR}/pic16xx.h ${CMAKE_CURRENT_SOURCE_DIR}/ppuser.h ${CMAKE_CURRENT_SOURCE_DIR}/rs232int.h ${CMAKE_CURRENT_SOURCE_DIR}/x2444.h) SET(PONY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/fusemdlg.h ${CMAKE_CURRENT_SOURCE_DIR}/usbwatcher.h ${CMAKE_CURRENT_SOURCE_DIR}/bitfield.h ${CMAKE_CURRENT_SOURCE_DIR}/filldlg.h ${CMAKE_CURRENT_SOURCE_DIR}/blockmdlg.h ${CMAKE_CURRENT_SOURCE_DIR}/e2cmdw.h # ${CMAKE_CURRENT_SOURCE_DIR}/ch341a.h ${CMAKE_CURRENT_SOURCE_DIR}/e2dlg.h ${CMAKE_CURRENT_SOURCE_DIR}/aboutmdlg.h ${CMAKE_CURRENT_SOURCE_DIR}/prefdialog.h ${CMAKE_CURRENT_SOURCE_DIR}/progoption.h ${CMAKE_CURRENT_SOURCE_DIR}/sernumdlg.h ${CMAKE_CURRENT_SOURCE_DIR}/infomdlg.h) SET(PONY_FORMS ${CMAKE_CURRENT_SOURCE_DIR}/forms/aboutdlg.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/editdlg.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/bitfield.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/notesdlg.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/e2dlg.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/fusedlg.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/mainwindow.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/osccalibr.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/prefdialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/progoption.ui ${CMAKE_CURRENT_SOURCE_DIR}/forms/sernumcfg.ui PARENT_SCOPE) SET(PONY_SOURCES ${PONY_SOURCES} PARENT_SCOPE) SET(PONY_NOMOC_HEADERS ${PONY_NOMOC_HEADERS} PARENT_SCOPE) SET(PONY_HEADERS ${PONY_HEADERS} PARENT_SCOPE) # SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${MAIN_SOURCES} ${MAIN_FORMS} ${MAIN_HEADERS} # PARENT_SCOPE) SET(APP_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ponyprog.qrc PARENT_SCOPE) # cleanup $build/*.cpp~ on "make clean" SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*~") tmp9balx013/SrcPony/ispinterf.h0000644000175000017500000000504213616566001016500 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AVRISPINTERFACE_H #define _AVRISPINTERFACE_H #include "lpt_ext_interf.h" class AvrISPInterface : public LptExtInterface { public: AvrISPInterface(bool use_io = false); virtual int Open(int com_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn(); virtual int GetClock(); virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP(); virtual int IsClockDataDOWN(); virtual int TestPort(int port); int SetPower(bool onoff); void SetControlLine(int res = 1); protected: private: int GetPresence(); }; #endif tmp9balx013/SrcPony/e2awinfo.cpp0000644000175000017500000007217213616566001016552 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "errcode.h" #include "eeptypes.h" #include "e2cmdw.h" #include "e2profil.h" #include "e2awinfo.h" // Header file #include #include #include #include e2AppWinInfo::e2AppWinInfo(e2CmdWindow *p, const QString &name, BusIO **busvptr) : hex_per_line(16), buffer_size(BUFFER_SIZE), load_type(ALL_TYPE), save_type(ALL_TYPE), load_relocation(0), save_relocation(0), buf_ok(false), buf_changed(false), // fname(0), no_block(0), splitted(0), roll_over(0), fuse_bits(0), lock_bits(0), fuse_ok(false), crc(0) { qDebug() << "e2AppWinInfo::e2AppWinInfo()"; // Constructor // cmdWin = static_cast(p); fname = ""; //qDebug() << "e2awinfo" << p << this; //p->SetAWInfo(this); eep24xx = new E24xx(this, busvptr[I2C - 1]); eep2401 = new mE2401(this, busvptr[I2C - 1]); eep24xx1 = new E24xx1(this, busvptr[I2C - 1]); eep24xx2 = new E24xx2(this, busvptr[I2C - 1]); eep24xx5 = new E24xx5(this, busvptr[I2C - 1]); eepAt90s = new At90sxx(this, busvptr[AT90S - 1]); eepAt89s = new At89sxx(this, busvptr[AT89S - 1]); eep93xx16 = new At93cxx(this, busvptr[AT93C - 1]); eep93xx8 = new At93cxx8(this, busvptr[AT93C - 1]); eepPic16 = new Pic16xx(this, busvptr[PICB - 1]); eep250xx = new At250xx(this, busvptr[AT250 - 1]); eep25xxx = new At25xxx(this, busvptr[AT250BIG - 1]); eep2506 = new Sde2506(this, busvptr[SDEB - 1]); eepPic168xx = new Pic168xx(this, busvptr[PICNEWB - 1]); eep3060 = new Nvm3060(this, busvptr[IMBUS - 1]); eepPic125xx = new Pic125xx(this, busvptr[PIC12B - 1]); eep17xxx = new At17xxx(this, busvptr[I2C - 1]); eep2444 = new X2444(this, busvptr[X2444B - 1]); eep2430 = new X2444(this, busvptr[S2430B - 1]); //AutoTag //Initialize Device Pointers vector // eep24xx.SetAWInfo(this); // eep24xx.SetBus(busvptr[I2C - 1]); // eep2401.SetAWInfo(this); // eep2401.SetBus(busvptr[I2C - 1]); // eep24xx1.SetAWInfo(this); // eep24xx1.SetBus(busvptr[I2C - 1]); // eep24xx2.SetAWInfo(this); // eep24xx2.SetBus(busvptr[I2C - 1]); // eep24xx5.SetAWInfo(this); // eep24xx5.SetBus(busvptr[I2C - 1]); // eepAt90s.SetAWInfo(this); // eepAt90s.SetBus(busvptr[AT90S - 1]); // eepAt89s.SetAWInfo(this); // eepAt89s.SetBus(busvptr[AT89S - 1]); // eep93xx16.SetAWInfo(this); // eep93xx16.SetBus(busvptr[AT93C - 1]); // eep93xx8.SetAWInfo(this); // eep93xx8.SetBus(busvptr[AT93C - 1]); // eepPic16.SetAWInfo(this); // eepPic16.SetBus(busvptr[PICB - 1]); // eep250xx.SetAWInfo(this); // eep250xx.SetBus(busvptr[AT250 - 1]); // eep25xxx.SetAWInfo(this); // eep25xxx.SetBus(busvptr[AT250BIG - 1]); // eep2506.SetAWInfo(this); // eep2506.SetBus(busvptr[SDEB - 1]); // eepPic168xx.SetAWInfo(this); // eepPic168xx.SetBus(busvptr[PICNEWB - 1]); // eep3060.SetAWInfo(this); // eep3060.SetBus(busvptr[IMBUS - 1]); // eepPic125xx.SetAWInfo(this); // eepPic125xx.SetBus(busvptr[PIC12B - 1]); // eep17xxx.SetAWInfo(this); // eep17xxx.SetBus(busvptr[I2C - 1]); // eep2444.SetAWInfo(this); // eep2444.SetBus(busvptr[X2444B - 1]); // eep2444.DefaultBankSize(); // eep2430.SetAWInfo(this); // eep2430.SetBus(busvptr[S2430B - 1]); // eep2430.DefaultBankSize(); SetFileName(name); //Initialize File Formats vector fbufvet[E2P] = &e2pfbuf; fbufvet[INTEL] = &intfbuf; fbufvet[MOTOS] = &motsfbuf; //** 17/03/99 fbufvet[BIN] = &binfbuf; fbufvet[CSM] = &csmfbuf; for (int k = 0; k < NO_OF_FILETYPE; k++) { fbufvet[k]->SetAWInfo(this); } eeprom_string = ""; //eeprom string ID eeprom_comment = ""; //eeprom comment ClearBuffer(); //Clear the new buffer SetEEProm(E2Profile::GetLastDevType()); SetFileBuf(E2Profile::GetDefaultFileType()); // SetFileBuf(E2P); SetLoadAutoClearBuf(E2Profile::GetClearBufBeforeLoad()); // Test and initialize the hardware // EK 2017 // TODO remove the app counter?? // if (E2Profile::GetCounter() == 1) { int err; // QMessageBox::note(win); if (!E2Profile::GetSkipStartupDialog()) { if (!cmdWin->scriptMode) { cmdWin->About(); } } err = cmdWin->LoadDriver(1); if (err != OK) { //TODO: translate message QMessageBox msgBox(QMessageBox::Critical, "Error", "Load I/O driver failed.", QMessageBox::Ok); msgBox.setStyleSheet(cmdWin->getStyleSheet()); msgBox.setButtonText(QMessageBox::Ok, "Close"); msgBox.exec(); } //imposta il bus iniziale (relativo al tipo di eeprom) cmdWin->SetInitialBus(eep->GetBus()); //case of command line parameter if (GetFileName().length()) { if (Load() <= 0) { SetFileName(""); } } else //Why we call OpenPort only if name is "" ??? { err = cmdWin->OpenPort(); if (err == E2ERR_ACCESSDENIED) { #ifdef Q_OS_WIN32 QString msg = "I/O access denied. Driver not found, try to install the software again"; #else QString msg = "I/O access denied. Run as root, or change the interface"; #endif //TODO: translate message QMessageBox msgBox(QMessageBox::Critical, "Error", msg, QMessageBox::Ok); msgBox.setStyleSheet(cmdWin->getStyleSheet()); msgBox.setButtonText(QMessageBox::Ok, "Close"); msgBox.exec(); } cmdWin->ClosePort(); } } #if 0 else if (GetFileName().length()) { if (Load() <= 0) { SetFileName(""); } } #endif // cmdWin->PostInit(); } e2AppWinInfo::~e2AppWinInfo() { qDebug() << "e2AppWinInfo::~e2AppWinInfo()"; // Destructor fname = ""; } bool e2AppWinInfo::SetFileName(const QString &name) { bool rval = false; if (name.length()) { if (name != fname) { fname = name; rval = true; } } else { fname = ""; } return rval; } void e2AppWinInfo::SleepBus() { cmdWin->SleepBus(); } int e2AppWinInfo::OpenBus() { return cmdWin->OpenBus(eep->GetBus()); } void e2AppWinInfo::Reset() { cmdWin->OpenBus(eep->GetBus()); SleepBus(); } void e2AppWinInfo::SetEEProm(unsigned long id) { // extern long BuildE2PType(int x, int y = 0); extern int GetE2PSubType(unsigned long x); extern int GetE2PPriType(unsigned long x); if (id == 0) { id = E2400; //to avoid segV } eep_id = id; //eep_type, eep_subtype are local shadow variables of eep_id int eep_type = GetE2PPriType(id); int eep_subtype = GetE2PSubType(id); // int eep_type = type; // int eep_subtype = subtype; //0 indica di usare GetNoOfBlock() switch (eep_type) { //AutoTag //Setting the device pointer to selected type case E24XX: eep = eep24xx; break; case E24XX1_A: eep = eep24xx1; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E2401_A); } break; case E24XX1_B: eep = eep2401; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E2401_B); } break; case E24XX2: eep = eep24xx2; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E2432); } eep->DefaultBankSize(); break; case E24XX5: eep = eep24xx5; break; case AT90SXX: { eep = eepAt90s; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(AT90S1200); } long xtype = GetEEPId(); eep->SetProgPageSize(GetEEPTypeWPageSize(xtype), false); At90sBus *b = static_cast(eep->GetBus()); b->SetFlashPagePolling((xtype != ATmega603) && (xtype != ATmega103)); b->SetOld1200Mode((xtype == AT90S1200)); break; } case AT89SXX: { eep = eepAt89s; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(AT89S8252); } long xtype = GetEEPId(); if (E2Profile::GetAt89PageOp()) { eep->SetProgPageSize(GetEEPTypeWPageSize(GetEEPId()), false); //write prog page size eep->SetProgPageSize(GetEEPTypeWPageSize(GetEEPId()), true); //read prog page size eep->SetDataPageSize(GetEEPTypeWPageSize(GetEEPId()) / 2, false); //write data page size eep->SetDataPageSize(GetEEPTypeWPageSize(GetEEPId()) / 2, true); //read data page size } At89sBus *b = static_cast(eep->GetBus()); b->SetCompatibilityMode((xtype == AT89S8252 || xtype == AT89S53)); b->SetFallingPhase((xtype == AT89S8253) && E2Profile::Get8253FallEdge()); b->SetPagePolling(true, (xtype == AT89S8253 || xtype == AT89S51 || xtype == AT89S52)); b->SetPagePolling(false, (xtype == AT89S8253)); break; } case E93X6: eep = eep93xx16; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E9306); } break; case E93XX_8: eep = eep93xx8; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E9306_8); } break; case PIC16XX: eep = eepPic16; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(PIC1684); } break; case PIC168XX: eep = eepPic168xx; // if (eep_subtype == 0) // { // eep_subtype = GetE2PSubType(PIC1684A); // } break; case PIC125XX: eep = eepPic125xx; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(PIC12508); } break; case E250XX: eep = eep250xx; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E25010); } break; case E25XXX: eep = eep25xxx; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E25080); } //eep->SetBus(GetBusVectorPtr()[AT250BIG-1]); break; case E2506XX: eep = eep2506; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(E2506); } break; case ENVMXXX: eep = eep3060; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(ENVM3060); } break; case AT17XXX: eep = eep17xxx; if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(AT1765); } break; case X24C44XX: if (eep_subtype == 0) { //no autodetect: set a reasonable default eep_subtype = GetE2PSubType(S24H30); } if (GetEEPId() == S24H30) { eep = eep2430; } else { eep = eep2444; } break; default: eep = eep24xx; //20/07/99 -- to prevent crash break; } fuse_ok = false; //invalidate current fuse settings SetSplittedInfo(GetEEPTypeSplit(id)); //Imposta la nuova dimensione della memoria in // base al tipo di eeprom. SetNoOfBlock(GetEEPTypeSize(id)); //Imposta la dimensione del banco che dipende // dal tipo di eeprom. SetBlockSize(eep->GetBankSize()); } int e2AppWinInfo::Read(int type, int raise_power, int leave_on) { int probe = !GetE2PSubType(eep_id); int rval = OK; qDebug() << "e2AppWinInfo::Read(" << type << "," << raise_power << "," << leave_on << ") - IN"; if (E2Profile::GetClearBufBeforeRead()) { if (load_type == ALL_TYPE) { ClearBuffer(ALL_TYPE); } else { if (load_type & PROG_TYPE) { ClearBuffer(PROG_TYPE); } if (load_type & DATA_TYPE) { ClearBuffer(DATA_TYPE); } } } if (raise_power) { rval = OpenBus(); //Set correct bus and power up } qDebug() << "e2AppWinInfo::Read() ** OpenBus = " << rval; if (rval == OK) { // CheckEvents(); if ((rval = eep->Read(probe, type)) > 0) { qDebug() << "e2AppWinInfo::Read() ** Read = " << rval; SetFileName(""); //avoid to use old name on next save() buf_ok = true; buf_changed = false; //Aggiunto il 18/03/99 con la determinazione dei numeri di banchi nelle E24xx2, // affinche` la dimensione rimanga quella impostata bisogna correggere la dimensione // del banco. SetBlockSize(eep->GetBankSize()); } RecalcCRC(); if (!(rval > 0 && leave_on)) { SleepBus(); } } qDebug() << "e2AppWinInfo::Read() = " << rval << " - OUT"; return rval; } int e2AppWinInfo::Write(int type, int raise_power, int leave_on) { int probe = !GetE2PSubType(eep_id); int rval = OK; qDebug() << "e2AppWinInfo::Write(" << type << "," << raise_power << "," << leave_on << ") - IN"; if (raise_power) { rval = OpenBus(); } if (rval == OK) { // CheckEvents(); if ((rval = eep->Write(probe, type)) > 0) { //Aggiunto il 18/03/99 con la determinazione dei numeri di banchi nelle E24xx2, // affinche` la dimensione rimanga quella impostata bisogna correggere la dimensione // del banco. SetBlockSize(eep->GetBankSize()); } if (!(rval > 0 && leave_on)) //23/01/1999 { SleepBus(); } } qDebug() << "e2AppWinInfo::Write() = " << rval << " - OUT"; return rval; } int e2AppWinInfo::Verify(int type, int raise_power, int leave_on) { int rval = OK; qDebug() << "e2AppWinInfo::Verify(" << type << "," << raise_power << "," << leave_on << ") - IN"; if (raise_power) { rval = OpenBus(); } if (rval == OK) { rval = eep->Verify(type); if (!(rval >= 0 && leave_on)) { SleepBus(); } } qDebug() << "e2AppWinInfo::Verify() = " << rval << " - OUT"; return rval; } int e2AppWinInfo::Erase(int type, int raise_power, int leave_on) { int rval = OK; qDebug() << "e2AppWinInfo::Erase(" << type << "," << raise_power << "," << leave_on << ") - IN"; if (raise_power) { rval = OpenBus(); } if (rval == OK) { rval = eep->Erase(1, type); if (!(rval >= 0 && leave_on)) { SleepBus(); } } qDebug() << "e2AppWinInfo::Erase() = " << rval << " - OUT"; return rval; } int e2AppWinInfo::BankRollOverDetect(int force) { if (OpenBus() == OK) { roll_over = eep->BankRollOverDetect(force); } SleepBus(); return roll_over; } int e2AppWinInfo::Load() { int rval; SetFileBuf(E2P); rval = LoadFile(); if (rval <= 0) { SetFileBuf(MOTOS); rval = LoadFile(); if (rval <= 0) { SetFileBuf(INTEL); rval = LoadFile(); } if (rval <= 0) { SetFileBuf(CSM); rval = LoadFile(); } if (rval <= 0) { SetFileBuf(BIN); rval = LoadFile(); } if (rval > 0) { if (GetE2PPriType(GetEEPId()) == PIC16XX || GetE2PPriType(GetEEPId()) == PIC168XX) { //It seems a bit tricky... //Relocate the DATA and CONFIG memory with PIC devices //The assembler store the DATA at 0x2100 (word address) and //CONFIG at 0x2000 (word address). //We move them after PROGRAM memory // PROGRAM MEMORY + DATA MEMORY + CONFIG (8 word) if (GetSplittedInfo() > 0 && GetSize() > GetSplittedInfo()) { //Copy Config memory if (GetSize() + 16 <= GetBufSize()) { memcpy(GetBufPtr() + GetSize(), GetBufPtr() + (0x2000 * 2), 16); } //Now copy data memory (copy only low byte every word) int k; uint8_t *dst = GetBufPtr() + GetSplittedInfo(); uint16_t *src = (uint16_t *)GetBufPtr() + 0x2100; for (k = 0; k < GetSize() - GetSplittedInfo(); k++) { *dst++ = (uint8_t)(*src++ & 0xff); } //memcpy(GetBufPtr()+GetSplittedInfo()+16, GetBufPtr() + (0x2100 * 2), GetSize() - (GetSplittedInfo() + 16) ); //Set fuse bits so the dialog shows the correct values uint8_t *ptr = GetBufPtr() + GetSize() + 14; uint16_t config = ptr[0] + ((uint16_t)ptr[1] << 8); //little endian buffer config = ~config & 0x3fff; // CodeProtectAdjust(config, 1); SetLockBits(config); } } else if (GetE2PPriType(GetEEPId()) == PIC125XX) { //Copy Config memory if (GetSize() + 16 <= GetBufSize()) { memcpy(GetBufPtr() + GetSize() + 14, GetBufPtr() + (0xFFF * 2), 2); } //Set fuse bits so the dialog shows the correct values uint8_t *ptr = GetBufPtr() + GetSize() + 14; uint16_t config = ptr[0] + ((uint16_t)ptr[1] << 8); //little endian buffer SetLockBits(~config & 0x0fff); } } } return rval; } int e2AppWinInfo::LoadFile() { if (clear_buffer_before_load) { if (load_type == ALL_TYPE) { ClearBuffer(ALL_TYPE); } else { if (load_type & PROG_TYPE) { ClearBuffer(PROG_TYPE); } if (load_type & DATA_TYPE) { ClearBuffer(DATA_TYPE); } } } int rval = fbufp->Load(load_type, load_relocation); if (rval > 0) { buf_ok = true; buf_changed = false; } RecalcCRC(); return rval; } int e2AppWinInfo::Save() { int rval; uint8_t *localbuf = new uint8_t[GetBufSize()]; //save buffer memcpy(localbuf, GetBufPtr(), GetBufSize()); memset(localbuf + GetSize(), 0xFF, GetBufSize() - GetSize()); /** ** NON va qui!!! Va messo in IntelFileBuf::Save(int savetype) ** e MotorolaFileBus::Save **/ if (save_type == ALL_TYPE && (GetFileBuf() == INTEL || GetFileBuf() == MOTOS)) { if (GetE2PPriType(GetEEPId()) == PIC16XX || GetE2PPriType(GetEEPId()) == PIC168XX) { //It seems a bit tricky... //Relocate the DATA and CONFIG memory with PIC devices //The assembler store the DATA at 0x2100 (word address) and //CONFIG at 0x2000 (word address). //We move them after PROGRAM memory // PROGRAM MEMORY + DATA MEMORY + CONFIG (8 word) if (GetSplittedInfo() > 0 && GetSize() > GetSplittedInfo()) { //Set ALL overbound buffer to 0xFF memset(GetBufPtr(), 0xFF, GetBufSize()); //Set fuse bits so the dialog shows the correct values if (0x2000 * 2 + 16 <= GetBufSize()) { uint16_t config = (uint16_t)GetLockBits(); if (GetEEPId() == PIC1683 || GetEEPId() == PIC1684 || GetEEPId() == PIC1684A) { if (config & (1 << 4)) { config |= 0xfff0; } else { config &= 0x000f; } } config = ~config & 0x3fff; // CodeProtectAdjust(config, 0); uint8_t *ptr = GetBufPtr() + (0x2000 * 2) + 14; ptr[0] = (uint8_t)(config & 0xFF); //little endian buffer ptr[1] = (uint8_t)(config >> 8); } //Copy prog memory if (GetSplittedInfo() <= GetBufSize()) { memcpy(GetBufPtr(), localbuf, GetSplittedInfo()); } //Copy data memory if (0x2100 * 2 + (GetSize() - GetSplittedInfo()) <= GetBufSize()) { //copy only low byte every word int k; uint8_t *src = localbuf + GetSplittedInfo(); uint16_t *dst = (uint16_t *)GetBufPtr() + 0x2100; for (k = 0; k < GetSize() - GetSplittedInfo(); k++) { *dst++ = *src++; } } } } else if (GetE2PPriType(GetEEPId()) == PIC125XX) { //Set ALL overbound buffer to 0xFF memset(GetBufPtr(), 0xFF, GetBufSize()); //Copy prog memory if (GetSplittedInfo() <= GetBufSize()) { memcpy(GetBufPtr(), localbuf, GetSize()); } //Set fuse bits so the dialog shows the correct values if (0xFFF * 2 + 2 <= GetBufSize()) { uint16_t config = (uint16_t)GetLockBits(); config = ~config & 0x0fff; // CodeProtectAdjust(config, 0); uint8_t *ptr = GetBufPtr() + (0xFFF * 2); ptr[0] = (uint8_t)(config & 0xFF); //little endian buffer ptr[1] = (uint8_t)(config >> 8); } } } rval = fbufp->Save(save_type, save_relocation); if (rval > 0) { buf_changed = false; } //restore buffer memcpy(GetBufPtr(), localbuf, GetBufSize()); delete[] localbuf; return rval; } long e2AppWinInfo::GetLoadRelocation() const { return load_relocation; } void e2AppWinInfo::SetLoadRelocation(long val) { if (val >= 0 && val < GetBufSize()) { load_relocation = val; } } long e2AppWinInfo::GetSaveRelocation() const { return save_relocation; } void e2AppWinInfo::SetSaveRelocation(long val) { if (val >= 0 && val < GetBufSize()) { save_relocation = val; } } int e2AppWinInfo::GetLoadType() const { return load_type; } int e2AppWinInfo::SetLoadType(int val) { int rval = 0; if (val == ALL_TYPE || val == PROG_TYPE || val == DATA_TYPE || val == CONFIG_TYPE) { load_type = val; rval = 1; } return rval; } int e2AppWinInfo::GetSaveType() const { return save_type; } int e2AppWinInfo::SetSaveType(int val) { int rval = 0; if (val == ALL_TYPE || val == PROG_TYPE || val == DATA_TYPE || val == CONFIG_TYPE) { save_type = val; rval = 1; } return rval; } void e2AppWinInfo::SetLockBits(uint32_t bits) { lock_bits = bits; } void e2AppWinInfo::SetFuseBits(uint32_t bits) { fuse_bits = bits; fuse_ok = true; } long e2AppWinInfo::GetSize() const { return (long)GetNoOfBlock() * (long)GetBlockSize(); } void e2AppWinInfo::SetFileBuf(FileType type) { if (type >= 0 && type < NO_OF_FILETYPE) { fbufp = fbufvet[type]; } else { fbufp = fbufvet[E2P]; //Tipo di default } } FileType e2AppWinInfo::GetFileBuf() const { FileType type; int n; for (n = 0; n < NO_OF_FILETYPE; n++) { type = (FileType)n; if (fbufvet[type] == fbufp) { break; } } return type; } QString e2AppWinInfo::GetStringID() { return eeprom_string; } void e2AppWinInfo::SetStringID(const QString &s) { if (s.length()) { eeprom_string = s; } else { eeprom_string = ""; } } QString e2AppWinInfo::GetComment() { return eeprom_comment; } void e2AppWinInfo::SetComment(const QString &s) { if (s.length()) { eeprom_comment = s; } else { eeprom_comment = ""; } } void e2AppWinInfo::ClearBuffer(int type) { if (type == ALL_TYPE) { memset(GetBufPtr(), 0xFF, GetBufSize()); buf_ok = true; //Validate buffer } else if (type == PROG_TYPE) { long s = GetSplittedInfo(); if (s <= 0 || s > GetBufSize()) { s = GetSize(); } memset(GetBufPtr(), 0xFF, s); } else if (type == DATA_TYPE) { long s = GetSplittedInfo(); if (s < 0 || s >= GetSize()) { s = 0; } memset(GetBufPtr() + s, 0xFF, GetSize() - s); } RecalcCRC(); } void e2AppWinInfo::FillBuffer(int init_pos, int ch, long len) { long l; if (len > 0) { l = len; } else { l = GetBufSize(); } if (init_pos >= GetBufSize()) { return; //Bad value } // Check for buffer overflow if (init_pos + l > GetBufSize()) { l = GetBufSize() - init_pos; } // If the buffer was not yet initialized we first // clear it. if (!buf_ok) { ClearBuffer(); } memset(GetBufPtr() + init_pos, ch, l); RecalcCRC(); BufChanged(); } void e2AppWinInfo::SwapBytes() { long size = GetNoOfBlock() * GetBlockSize(); long k; for (k = 0; k < size; k += 2) { uint8_t tmp = buffer[k]; buffer[k] = buffer[k + 1]; buffer[k + 1] = tmp; } RecalcCRC(); BufChanged(); } void e2AppWinInfo::DoubleSize() { if (GetSize() == AUTOSIZE_ID) { return; } //Attenzione!! Il buffer deve essere capiente il doppio // della dimensione del dispositivo attuale // int n = GetNoOfBlock(); int k; for (k = GetNoOfBlock() - 1; k >= 0; k--) { //Copia l'ultimo banco nei due banchi in fondo if (k) { //Non copiarlo su se stesso! memcpy(buffer + k * 2 * GetBlockSize(), buffer + k * GetBlockSize(), GetBlockSize() ); } memcpy(buffer + (k * 2 + 1) * GetBlockSize(), buffer + k * GetBlockSize(), GetBlockSize() ); } RecalcCRC(); BufChanged(); } int e2AppWinInfo::SecurityRead(uint32_t &bits) { int rv; OpenBus(); rv = eep->SecurityRead(bits); SleepBus(); RecalcCRC(); if (rv == OK) { lock_bits = bits; } return rv; } int e2AppWinInfo::SecurityWrite(uint32_t bits, bool no_param) { int rv; if (no_param) { bits = lock_bits; } OpenBus(); rv = eep->SecurityWrite(bits); SleepBus(); return rv; } //The 24C65 microchip device has high endurance bits // in place of Fuse bits. // Use the same variable because there is no room for // both in the e2p header. int e2AppWinInfo::HighEnduranceRead(uint32_t &block_no) { int rv; OpenBus(); rv = eep->HighEnduranceRead(block_no); SleepBus(); if (rv == OK) { SetFuseBits(block_no); } return rv; } int e2AppWinInfo::HighEnduranceWrite(uint32_t block_no, bool no_param) { int rv; if (no_param) { block_no = GetFuseBits(); } OpenBus(); rv = eep->HighEnduranceWrite(block_no); SleepBus(); if (rv == OK) { uint32_t block2; OpenBus(); rv = eep->HighEnduranceRead(block2); SleepBus(); if (rv == OK && block_no != block2) { rv = E2ERR_WRITEFAILED; } } return rv; } int e2AppWinInfo::FusesRead(uint32_t &bits) { int rv; OpenBus(); rv = eep->FusesRead(bits); SleepBus(); if (rv == OK) { SetFuseBits(bits); } return rv; } int e2AppWinInfo::FusesWrite(uint32_t bits, bool no_param) { int rv; if (no_param) { bits = GetFuseBits(); } OpenBus(); rv = eep->FusesWrite(bits); SleepBus(); /** the read op doesn't work with every device if (rv == OK) { uint32_t bits2; OpenBus(); rv = eep->FusesRead(bits2); SleepBus(); if (rv == OK && bits != bits2) rv = E2ERR_WRITEFAILED; } **/ return rv; } int e2AppWinInfo::ReadOscCalibration(int addr) { int val; OpenBus(); val = eep->ReadCalibration(addr); SleepBus(); return val; } #include "crc.h" uint16_t e2AppWinInfo::RecalcCRC() { uint16_t crc_val = mcalc_crc(GetBufPtr(), GetSize()); SetCRC(crc_val); return crc_val; } // #include QString e2AppWinInfo::Dump(int line, int type) { long idx; long upperlimit; if (!buf_ok) { return ""; } upperlimit = GetSize() == 0 ? GetBufSize() : GetSize(); idx = line * hex_per_line; if (idx < upperlimit) { if (type == 0) { char tmpbuf[16 + 1]; for (int k = 0; k < hex_per_line; k++) { tmpbuf[k] = isprint(buffer[idx + k]) ? buffer[idx + k] : '.'; } tmpbuf[hex_per_line] = 0; linebuf.sprintf(" %06lX) %02X %02X %02X %02X %02X %02X %02X %02X - %02X %02X %02X %02X %02X %02X %02X %02X %s\n", // snprintf(linebuf, LINEBUF_SIZE, " %06lX) %02X %02X %02X %02X %02X %02X %02X %02X - %02X %02X %02X %02X %02X %02X %02X %02X %s\n", idx, buffer[idx + 0], buffer[idx + 1], buffer[idx + 2], buffer[idx + 3], buffer[idx + 4], buffer[idx + 5], buffer[idx + 6], buffer[idx + 7], buffer[idx + 8], buffer[idx + 9], buffer[idx + 10], buffer[idx + 11], buffer[idx + 12], buffer[idx + 13], buffer[idx + 14], buffer[idx + 15], tmpbuf ); } else if (type == 1) { linebuf.sprintf(" %06lX)", idx); // snprintf(linebuf, LINEBUF_SIZE, " %06lX)", idx); } else if (type == 2) { linebuf.sprintf(" %02X %02X %02X %02X %02X %02X %02X %02X - %02X %02X %02X %02X %02X %02X %02X %02X ", // snprintf(linebuf, LINEBUF_SIZE, " %02X %02X %02X %02X %02X %02X %02X %02X - %02X %02X %02X %02X %02X %02X %02X %02X ", buffer[idx + 0], buffer[idx + 1], buffer[idx + 2], buffer[idx + 3], buffer[idx + 4], buffer[idx + 5], buffer[idx + 6], buffer[idx + 7], buffer[idx + 8], buffer[idx + 9], buffer[idx + 10], buffer[idx + 11], buffer[idx + 12], buffer[idx + 13], buffer[idx + 14], buffer[idx + 15] ); } else { char tmpbuf[16 + 1]; for (int k = 0; k < hex_per_line; k++) { tmpbuf[k] = isprint(buffer[idx + k]) ? buffer[idx + k] : '.'; } tmpbuf[hex_per_line] = 0; linebuf.sprintf(" %s\n", tmpbuf); // snprintf(linebuf, LINEBUF_SIZE, " %s\n", tmpbuf); } // linebuf[LINEBUF_SIZE - 1] = '\0'; } return linebuf; } tmp9balx013/SrcPony/e2401.h0000644000175000017500000000524113616566001015231 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _mE2401_H #define _mE2401_H #include "types.h" #include "device.h" #include "i2cbus.h" class mE2401 : public Device { public: mE2401(e2AppWinInfo *wininfo = 0, BusIO *busp = 0, int def_banksize = 128); // virtual ~mE2401(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: int const timeout_loop; //eeprom timeout I2CBus *GetBus() { return static_cast(Device::GetBus()); } //-- Parte riguardante la EEPROM int sequential_read; //1 --> legge un banco in una volta int writepage_size; //se > 1 scrive una pagina alla volta private: }; #endif tmp9balx013/SrcPony/at89sbus.cpp0000644000175000017500000003157113616566001016520 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at89sbus.h" #include "errcode.h" #include "eeptypes.h" #include "e2profil.h" #include "e2cmdw.h" #include #include // NB: Intel Hex format is Little Endian #undef _BIG_ENDIAN_ At89sBus::At89sBus(BusInterface *ptr) : SPIBus(ptr), EnableProg0(0xAC), EnableProg1(0x53), ChipErase0(0xAC), ChipErase1(0x80), OldChipErase1(0x04), ReadProgByteMem(0x20), OldReadProgMem(0x01), WriteProgByteMem(0x40), OldWriteProgMem(0x02), ReadProgPageMem(0x30), WriteProgPageMem(0x50), ReadDataByteMem(0xA0), OldReadDataMem(0x05), WriteDataByteMem(0xC0), OldWriteDataMem(0x06), ReadDataPageMem(0xB0), WriteDataPageMem(0xD0), ReadUserFuses0(0x21), ReadUserFuses1(0x00), WriteUserFuses0(0xAC), WriteUserFuses1(0x10), ReadLockBits0(0x24), ReadLockBits1(0x00), WriteLockBits0(0xAC), WriteLockBits1(0xE0), OldWriteLockBits1(0x07), ReadSignatureByte(0x28), enable_datapage_polling(false), enable_progpage_polling(false), twd_erase(50), twd_prog(20), oldmode(true) { } void At89sBus::SetDelay() { int val = E2Profile::GetSPISpeed(); int n; switch (val) { case TURBO: n = 1; break; case FAST: n = 5; break; case SLOW: n = 30; break; case VERYSLOW: n = 100; break; case ULTRASLOW: n = 1000; break; default: n = 15; break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } int At89sBus::ReadDataByte(long addr) { if (oldmode) { SendDataByte(OldReadDataMem | ((addr >> 5) & 0xF8)); } else { SendDataByte(ReadDataByteMem); SendDataByte(addr >> 8); } SendDataByte(addr & 0xFF); return RecDataByte(); } void At89sBus::WriteDataByte(long addr, int data) { if (oldmode) { SendDataByte(OldWriteDataMem | ((addr >> 5) & 0xF8)); } else { SendDataByte(WriteDataByteMem); SendDataByte(addr >> 8); } SendDataByte(addr & 0xFF); SendDataByte(data); } int At89sBus::ReadProgByte(long addr) { if (oldmode) { SendDataByte(OldReadProgMem | ((addr >> 5) & 0xF8) | ((addr >> 11) & 0x04)); } else { SendDataByte(ReadProgByteMem); SendDataByte(addr >> 8); } SendDataByte(addr & 0xFF); return RecDataByte(); } void At89sBus::WriteProgByte(long addr, int data) { SetLastProgrammedAddress(addr); if (oldmode) { SendDataByte(OldWriteProgMem | ((addr >> 5) & 0xF8) | ((addr >> 11) & 0x04)); } else { SendDataByte(WriteProgByteMem); SendDataByte(addr >> 8); } SendDataByte(addr & 0xFF); SendDataByte(data); } int At89sBus::WriteProgPage(long addr, uint8_t const *data, long page_size, long timeout) { long k; bool okflag; if (page_size <= 0 || data == NULL) { return BADPARAM; } //align addr to page boundary addr &= ~(page_size - 1); //0xFFFFFF00 SendDataByte(WriteProgPageMem); SendDataByte(addr >> 8); SendDataByte(addr & 0xff); for (k = 0; k < page_size; k++) { SendDataByte(data[k]); } SetLastProgrammedAddress(addr + page_size - 1); if (enable_progpage_polling) { long polling_loc = addr + page_size - 1; //Read back last loaded byte uint8_t polling_data = data[page_size - 1]; WaitUsec(100); okflag = false; for (k = timeout; k > 0; k--) { if (ReadProgByte(polling_loc) == polling_data) { okflag = true; break; } } } else { okflag = true; WaitMsec(twd_prog); } return okflag ? OK : E2P_TIMEOUT; } int At89sBus::WriteDataPage(long addr, uint8_t const *data, long page_size, long timeout) { long k; bool okflag; //align addr to page boundary addr &= ~(page_size - 1); //0xFFFFFF00 SendDataByte(WriteDataPageMem); SendDataByte(addr >> 8); SendDataByte(addr & 0xff); for (k = 0; k < page_size; k++) { SendDataByte(data[k]); } if (enable_datapage_polling) { long polling_loc = addr + page_size - 1; //Read back last loaded byte uint8_t polling_data = data[page_size - 1]; WaitUsec(100); okflag = false; for (k = timeout; k > 0; k--) { if (ReadDataByte(polling_loc) == polling_data) { okflag = true; break; } } } else { okflag = true; WaitMsec(twd_prog); } return okflag ? OK : -1; } void At89sBus::ReadProgPage(long addr, uint8_t *data, long page_size, long timeout) { long k; //align addr to page boundary addr &= ~(page_size - 1); //0xFFFFFF00 SendDataByte(ReadProgPageMem); SendDataByte(addr >> 8); SendDataByte(addr & 0xff); for (k = 0; k < page_size; k++) { data[k] = RecDataByte(); } } void At89sBus::ReadDataPage(long addr, uint8_t *data, long page_size, long timeout) { long k; //align addr to page boundary addr &= ~(page_size - 1); //0xFFFFFF00 SendDataByte(ReadDataPageMem); SendDataByte(addr >> 8); SendDataByte(addr & 0xff); for (k = 0; k < page_size; k++) { data[k] = RecDataByte(); } } int At89sBus::Reset() { if (oldmode) { twd_prog = 20; } else { twd_prog = 5; } SPIBus::Reset(); WaitMsec(E2Profile::GetAT89DelayAfterReset()); //At least 20msec (from AVR atmel datasheet) SendDataByte(EnableProg0); SendDataByte(EnableProg1); SendDataByte(0); if (!oldmode) { SendDataByte(0); } return OK; } int At89sBus::WriteLockBits(uint32_t param, long model) { int val1, val2, val3, val4; val1 = -1; val2 = val3 = val4 = 0; switch (model) { case AT89S8253: val1 = WriteLockBits0; val2 = WriteLockBits1 | (~param & 0x07); break; case AT89S51: case AT89S52: //Translate from B1-B2 code to LB1-LB2-LB3 //... break; default: val1 = WriteLockBits0; val2 = OldWriteLockBits1; val2 |= 0xff & ~param; break; } if (val1 != -1) { SendDataByte(val1); SendDataByte(val2); SendDataByte(val3); if (oldmode) { WaitMsec(twd_prog * 5); } else { SendDataByte(val4); WaitMsec(twd_prog * 10); } return OK; } else { return NOTSUPPORTED; } } int At89sBus::ReadLockBits(uint32_t &res, long model) { int rval = OK; uint32_t rv1; switch (model) { case AT89S8253: SendDataByte(ReadLockBits0); SendDataByte(ReadLockBits1); SendDataByte(0); rv1 = RecDataByte(); res = ~rv1 & 0x07; break; case AT89S51: case AT89S52: //NB.Different polarity from other devices: 1 mean programmed (should update message in the dialog) SendDataByte(ReadLockBits0); SendDataByte(ReadLockBits1); SendDataByte(0); rv1 = RecDataByte(); res = rv1 & 0x1C; break; default: rval = NOTSUPPORTED; break; } return rval; } int At89sBus::WriteFuseBits(uint32_t param, long model) { int val1, val2, val3, val4; val1 = -1; val2 = val3 = val4 = 0; switch (model) { case AT89S8253: val1 = WriteUserFuses0; val2 = WriteUserFuses1 | (~param & 0x0f); break; default: //No Fuses break; } if (val1 != -1) { SendDataByte(val1); SendDataByte(val2); SendDataByte(val3); SendDataByte(val4); WaitMsec(twd_prog * 10); return OK; } else { return NOTSUPPORTED; } } int At89sBus::ReadFuseBits(uint32_t &res, long model) { int rval = OK; uint32_t rv1; switch (model) { case AT89S8253: SendDataByte(ReadUserFuses0); SendDataByte(ReadUserFuses1); SendDataByte(0); rv1 = RecDataByte(); res = ~rv1 & 0x0f; break; default: //No Fuses rval = NOTSUPPORTED; break; } return rval; } int At89sBus::ReadDeviceCode(int addr) { SendDataByte(ReadSignatureByte); SendDataByte(addr >> 8); SendDataByte(addr & 0xff); return RecDataByte(); } int At89sBus::Erase(int type) { //Erase command SendDataByte(ChipErase0); if (oldmode) { SendDataByte(OldChipErase1); SendDataByte(0); } else { SendDataByte(ChipErase1); SendDataByte(0); SendDataByte(0); } WaitMsec(twd_erase); Reset(); return 1; } long At89sBus::Read(int addr, uint8_t *data, long length, int page_size) { long len; ReadStart(); if (addr) { //Data if (page_size > 1) { for (addr = 0, len = 0; len < length; len += page_size, addr += page_size, data += page_size) { ReadDataPage(addr, data, page_size); if (ReadProgress(len * 100 / length)) { break; } } } else { for (addr = 0, len = 0; len < length; len++) { *data++ = (uint8_t)ReadDataByte(addr++); if (ReadProgress(len * 100 / length)) { break; } } } } else { //Prog if (page_size > 1) { for (addr = 0, len = 0; len < length; len += page_size, addr += page_size, data += page_size) { ReadProgPage(addr, data, page_size); if (ReadProgress(len * 100 / length)) { break; } } } else { for (addr = 0, len = 0; len < length; len++) { *data++ = (uint8_t)ReadProgByte(addr++); if (ReadProgress(len * 100 / length)) { break; } } } } WaitMsec(1); //Flush ReadEnd(); return len; } int At89sBus::WaitReadyAfterWrite(int type, long addr, int data, long timeout) { int rval = E2P_TIMEOUT; int k; for (k = 0; k < timeout; k++) { int val; if (type) { val = ReadDataByte(addr); } else { val = ReadProgByte(addr); } if (val == data) { rval = OK; break; } } return rval; } bool At89sBus::CheckBlankPage(uint8_t const *data, long length) { bool blank_page = true; while (length--) { if (*data++ != 0xFF) { blank_page = false; break; } } return blank_page; } long At89sBus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); if (addr) { //Data if (page_size > 1) { for (addr = 0, len = 0; len < length; len += page_size, addr += page_size, data += page_size) { if (WriteDataPage(addr, data, page_size) != OK) { return E2ERR_WRITEFAILED; } if (WriteProgress(len * 100 / length)) { break; } } } else { for (addr = 0, len = 0; len < length; addr++, data++, len++) { int val = ReadDataByte(addr); if (val != *data) { if ((val & *data) != *data) { return E2ERR_BLANKCHECKFAILED; } else { WriteDataByte(addr, *data); WaitUsec(100); //Interrupt the writing and exit (device missing?) if (WaitReadyAfterWrite(1, addr, *data) != OK) { return E2ERR_WRITEFAILED; } } } if (WriteProgress(len * 100 / length)) { break; } } } } else { //Prog if (page_size > 1) { for (addr = 0, len = 0; len < length; len += page_size, addr += page_size, data += page_size) { //check for FF's page to skip blank pages if (!CheckBlankPage(data, page_size)) if (WriteProgPage(addr, data, page_size) != OK) { return E2ERR_WRITEFAILED; } if (WriteProgress(len * 100 / length)) { break; } } } else { for (addr = 0, len = 0; len < length; addr++, data++, len++) { int val = ReadProgByte(addr); if (val != *data) { if ((val & *data) != *data) { return E2ERR_BLANKCHECKFAILED; } else { WriteProgByte(addr, *data); WaitUsec(100); //Interrupt the writing and exit (device missing?) if (WaitReadyAfterWrite(0, addr, *data) != OK) { return E2ERR_WRITEFAILED; } } } if (WriteProgress(len * 100 / length)) { break; } } } } WaitMsec(1); //Flush WriteEnd(); return len; } tmp9balx013/SrcPony/at89sxx.h0000644000175000017500000000517013616566001016027 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT89SXX_H #define _AT89SXX_H #include "types.h" #include "device.h" #include "at89sbus.h" class At89sxx : public Device { public: At89sxx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); // virtual ~At89sxx(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); // int Erase(int probe = 1, int type = ALL_TYPE); int SecurityRead(uint32_t &bits); int SecurityWrite(uint32_t bits); int FusesRead(uint32_t &bits); int FusesWrite(uint32_t bits); At89sBus *GetBus() { return static_cast(Device::GetBus()); } protected: int QueryType(long &type); private: }; #endif tmp9balx013/SrcPony/bitfield.cpp0000644000175000017500000002672313616566001016623 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include "bitfield.h" BitFieldWidget::BitFieldWidget(QWidget *parent, QVector &vInfo, QVector &vMask, unsigned int field, const QString &chipNm) : QWidget(parent) { setupUi(this); chipName = chipNm; vecInfo = &vInfo; vecDescr = &vMask; bField = field; lstComboBoxes = (QVector() << comboBox0 << comboBox1 << comboBox2 << comboBox3); for (int i = 0; i < lstComboBoxes.count(); i++) { lstComboBoxes.at(i)->setHidden(true); } initWidget(); } BitFieldWidget::~BitFieldWidget() { qDebug() << "BitFieldWidget::~BitFieldWidget()"; } void BitFieldWidget::initWidget() { if (vecInfo->count() > 0) { int lastBit = 0; for (int i = 0; i < vecInfo->count(); i++) { QTreeWidgetItem *itm = new QTreeWidgetItem(); int bitOffset = vecInfo->at(i).bit; lastBit = bitOffset; QString sDes = vecInfo->at(i).ShortDescr; itm->setText(0, QString().sprintf("Bit %d, ", bitOffset) + sDes); if (vecInfo->at(i).LongDescr.length() > 0) { itm->setText(1, vecInfo->at(i).LongDescr); } itm->setFlags(itm->flags() | Qt::ItemIsUserCheckable); itm->setCheckState(0, Qt::Unchecked); if (bField & (1 << bitOffset)) { itm->setCheckState(0, Qt::Checked); } if (sDes == "SPIEN") { itm->setFlags(itm->flags() ^ Qt::ItemIsEnabled); itm->setCheckState(0, Qt::Checked); bField |= (1 << bitOffset); } if (sDes == "RSTDISBL") { itm->setCheckState(0, Qt::Unchecked); bField &= ~(1 << bitOffset); } treeWidget->addTopLevelItem(itm); } // reset not used bits for (unsigned int i = (lastBit + 1); i < 32; i++) { bField &= ~(1U << i); } treeWidget->expandAll(); treeWidget->resizeColumnToContents(0); connect(treeWidget, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(onBitClicked(QTreeWidgetItem *, int))); } scanMasks(); createComboLists(); // init of comboboxes for (int i = 0; i < treeWidget->topLevelItemCount(); i++) { if (treeWidget->topLevelItem(i)->text(1).length() == 0) { emit onBitClicked(treeWidget->topLevelItem(i), 0); } } } unsigned int BitFieldWidget::getBitfield() { return bField; } void BitFieldWidget::createComboLists() { for (int i = 0; i < maskList.count(); i++) { QStringList lst; QString currentMask = maskList.at(i); // two loops are not optimal! foreach (MaskDescr mdes, *vecDescr) { if (mdes.mask.indexOf(QRegExp(currentMask)) >= 0) { int posBeg = mdes.LongDescr.indexOf("=$n"); if (posBeg > 0) { QString tStr = mdes.LongDescr; // TODO replace text with text from mdes.ExtDescr int posExtText = mdes.ExtDescr.indexOf(chipName + ": "); if (posExtText >= 0) { posExtText += chipName.length(); QString addrTxt = mdes.ExtDescr.simplified().mid(posExtText + 2, 5); tStr.replace(posBeg + 1, 5, addrTxt); } lst << tStr; } else { lst << mdes.LongDescr; } } } // when not all combinations are descripted // if (isExp(lst.count()) == false) if ((1 << maskBitSum.at(i)) != lst.count()) { lst << "Undefined combination"; } lstComboBoxes.at(i)->setHidden(false); lstComboBoxes.at(i)->addItems(lst); connect(lstComboBoxes.at(i), SIGNAL(activated(int)), this, SLOT(onComboSelected(int))); } } void BitFieldWidget::scanMasks() { maskList.clear(); maskBitSum.clear(); // analyse from mask entries foreach (MaskDescr mdes, *vecDescr) { QString cMask = mdes.mask; cMask.replace(QRegExp("\\d+"), "\\d+"); // at string begin only cMask = "^" + cMask; if (maskList.indexOf(cMask) == -1) { maskList << cMask; int numBits = 0; QRegExp rx("(\\d+)"); int pos = 0; while ((pos = rx.indexIn(mdes.mask, pos)) != -1) { QString n = rx.cap(1); numBits += n.length(); pos += rx.matchedLength(); } qDebug() << mdes.mask << "bits" << numBits; maskBitSum << numBits; } } qDebug() << maskList; } bool BitFieldWidget::isExp(unsigned int a) { return (a > 0 && (a & (a - 1)) == 0); } void BitFieldWidget::onComboSelected(int idx) { QComboBox *s = static_cast(sender()); int globIdx = 0; int nMask = -1; // no changes in this case if (s->currentText() == "Undefined combination") { return; } // we have only 4 comboboxes for lock for (int i = 0; i < 4; i++) { if (lstComboBoxes.at(i) == s) { nMask = i; break; } globIdx += lstComboBoxes.at(i)->count(); // correcture for undefined if (lstComboBoxes.at(i)->findText("Undefined combination") > 0) { globIdx--; } } if (nMask < 0) { return; } globIdx += idx; qDebug() << "onComboSelected index" << globIdx; if (vecDescr->at(globIdx).mask.length() == 0) { return; } // deactivate signal from checkbutton disconnect(treeWidget, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(onBitClicked(QTreeWidgetItem *, int))); // possible list QStringList mskList = vecDescr->at(globIdx).mask.split(" "); qDebug() << mskList << vecDescr->at(globIdx).LongDescr; foreach (QString cMask, mskList) { setMaskBits(cMask); } // activate signal connect(treeWidget, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(onBitClicked(QTreeWidgetItem *, int))); emit displayBitFields(bField); } void BitFieldWidget::setMaskBits(const QString &cMask) { int p = cMask.indexOf("="); if (p < 0) { // not correct format return; } QString mskName = cMask.left(p); QString bitStr = cMask.mid(p + 1); bool ok; unsigned int localField = bitStr.toInt(&ok, 2); int idx; // at begin of string only mskName = "^" + mskName + "\\d+"; qDebug() << cMask << "converted to" << mskName << (bin) << localField << (dec); // search in QTreeWidget the names for (idx = 0; idx < treeWidget->topLevelItemCount(); idx++) { QString t = treeWidget->topLevelItem(idx)->text(0); int pos = t.indexOf(", "); if (pos > 0) { QString nm = t.mid(pos + 2); // first element found if (nm.indexOf(QRegExp(mskName)) == 0) { break; } } } if (idx >= treeWidget->topLevelItemCount()) { qDebug() << "setMaskBits is wrong"; return; } int bitOffset = vecInfo->at(idx).bit; for (int i = 0; i < bitStr.length(); i++) { Qt::CheckState st; if (localField & 0x01) { st = Qt::Unchecked; bField |= (1 << bitOffset); } else { st = Qt::Checked; bField &= ~(1 << bitOffset); } localField >>= 1; treeWidget->topLevelItem(idx)->setCheckState(0, st); QString t = treeWidget->topLevelItem(idx)->text(0); int pos = t.indexOf(", "); if (pos > 0) { QString nm = t.mid(pos + 2); if (nm.indexOf(QRegExp(mskName)) < 0) { break; } } else { break; } bitOffset++; idx++; } } void BitFieldWidget::onBitClicked(QTreeWidgetItem *itm, int col) { Qt::CheckState st = itm->checkState(0); QString t = itm->text(0); int pos = t.indexOf(","); if (pos < 0) { return; } QString fuseName = t.mid(pos + 2); if (fuseName == "RSTDISBL") { QMessageBox msgBox(QMessageBox::Warning, "Warning", "Attention! If you disable Reset pin you can't access the the chip anymore", QMessageBox::Yes | QMessageBox::No); // msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, "Yes"); msgBox.setButtonText(QMessageBox::No, "No"); int res = msgBox.exec(); if (res == QMessageBox::No) { return; } } t = t.left(pos); t.remove("Bit "); int bOffset = t.toInt(); if (st == Qt::Checked) { bField |= (1 << bOffset); } else { bField &= ~(1 << bOffset); } displayBitFields(bField); qDebug() << fuseName << maskList; int idxCombo = -1; for (int i = 0; i < maskList.count(); i++) { QString m = maskList.at(i); QStringList mSplitted = m.split(" "); for (int r = 0; r < mSplitted.count(); r++) { QString msplt = mSplitted.at(r); msplt.remove("="); if (fuseName.indexOf(QRegExp(msplt)) >= 0) { idxCombo = i; qDebug() << "found " << msplt << i; break; } } if (idxCombo != -1) { break; } } // maskListFuse.at(idxCombo) has mask to search // and idxCombo is the number of list if (idxCombo == -1) { return; } QString completeMask = maskList.at(idxCombo); // now replace the \\d+ with bit information from treewidget QStringList mSplitted = completeMask.split(" "); for (int r = 0; r < mSplitted.count(); r++) { QString orig = mSplitted.at(r); QString msplt = orig; msplt.remove("="); qDebug() << msplt; QString bitString; for (int iTree = 0; iTree < treeWidget->topLevelItemCount(); ++iTree) { QString t = treeWidget->topLevelItem(iTree)->text(0); int pos = t.indexOf(", "); if (pos <= 0) { continue; } t = t.mid(pos + 2); if (t.indexOf(QRegExp(msplt)) >= 0) { if (treeWidget->topLevelItem(iTree)->checkState(0) == Qt::Checked) { bitString = "0" + bitString; } else { bitString = "1" + bitString; } } } if (bitString.length() > 0) { msplt.replace("\\d+", QString("=" + bitString)); completeMask.replace(orig, msplt); } } qDebug() << "converted: " << completeMask << "idx" << idxCombo; if (completeMask.length() > 0) { int i; for (i = 0; i < vecDescr->count(); i++) { if (vecDescr->at(i).mask.indexOf(QRegExp(completeMask)) == 0) { QString comboText = vecDescr->at(i).LongDescr; int c = lstComboBoxes.at(idxCombo)->findText(comboText); if (c >= 0) { lstComboBoxes.at(idxCombo)->setCurrentIndex(c); } break; } } if (i == vecDescr->count()) { int p = lstComboBoxes.at(idxCombo)->findText("Undefined combination"); if (p >= 0) { lstComboBoxes.at(idxCombo)->setCurrentIndex(p); } } } } tmp9balx013/SrcPony/rs232int.cpp0000644000175000017500000004324713616566001016427 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include #include #include "e2profil.h" #include "rs232int.h" #include "errcode.h" #ifdef Q_OS_LINUX #include #include #include #include #include #include #include #define INVALID_HANDLE_VALUE -1 #endif RS232Interface::RS232Interface() { qDebug() << "RS232Interface::RS232Interface()"; // profile = prof; //COM default settings actual_speed = 9600; actual_parity = 'N'; actual_bits = 8; actual_stops = 1; actual_flowcontrol = 0; //No flow control by default //NO timeouts by default read_total_timeout = 0; read_interval_timeout = 0; wait_endTX_mode = false; #ifdef Q_OS_WIN32 hCom = INVALID_HANDLE_VALUE; #elif defined(Q_OS_LINUX) fd = INVALID_HANDLE_VALUE; #endif //By default com_no == 0, so don't open any serial port if the constructor is called with zero paramameters // OpenSerial(com_no); qDebug() << "RS232Interface::RS232Interface() O"; } RS232Interface::~RS232Interface() { qDebug() << "RS232Interface::~RS232Interface()"; CloseSerial(); } #ifdef Q_OS_LINUX static int fd_clear_flag(int fd, int flags); #endif int RS232Interface::OpenSerial(int no) { int ret_val = E2ERR_OPENFAILED; QString devname; if (no >= 0 && no < 32) { #ifdef Q_OS_WIN32 no++; //linux call ttyS0 --> COM1, ttyS1 --> COM2, etc.. #endif devname = E2Profile::GetCOMDevName() + QString::number(no); ret_val = OpenSerial(devname); } return ret_val; } int RS232Interface::OpenSerial(QString devname) { qDebug() << "RS232Interface::OpenSerial(" << devname << ") I"; int ret_val = E2ERR_OPENFAILED; m_devname = devname; #ifdef Q_OS_WIN32 hCom = CreateFile((LPCWSTR)m_devname.utf16(), GENERIC_READ | GENERIC_WRITE, 0, /* comm devices must be opened w/exclusive-access */ NULL, /* no security attrs */ OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */ 0, /* not overlapped I/O */ NULL /* hTemplate must be NULL for comm devices */ ); if (hCom != INVALID_HANDLE_VALUE) { GetCommState(hCom, &old_dcb); GetCommTimeouts(hCom, &old_timeout); GetCommMask(hCom, &old_mask); if (wait_endTX_mode) { SetCommMask(hCom, EV_TXEMPTY); } else { SetCommMask(hCom, 0); } SetSerialTimeouts(); SetSerialParams(); ret_val = OK; } #elif defined(Q_OS_LINUX) fd = INVALID_HANDLE_VALUE; qDebug() << "RS232Interface::OpenSerial() now open the device " << m_devname; fd = open(m_devname.toLatin1().constData(), O_RDWR | O_NONBLOCK | O_EXCL); qDebug() << "RS232Interface::OpenSerial open result = " << fd; if (fd < 0) { qDebug() << "RS232Interface::OpenSerial can't open the device " << devname; return ret_val; } // Check for the needed IOCTLS #if defined(TIOCSBRK) && defined(TIOCCBRK) //check if available for compilation // Check if available during runtime if ((ioctl(fd, TIOCSBRK, 0) == -1) || (ioctl(fd, TIOCCBRK, 0) == -1)) { qDebug() << "RS232Interface::OpenPort IOCTL not available"; close(fd); fd = INVALID_HANDLE_VALUE; return ret_val; } #else close(fd); fd = INVALID_HANDLE_VALUE; return ret_val; #endif /*TIOCSBRK*/ /* open sets RTS and DTR, reset it */ #if defined(TIOCMGET) && defined(TIOCMSET) //check if available for compilation int flags; if (ioctl(fd, TIOCMGET, &flags) == -1) { qDebug() << "RS232Interface::OpenPort IOCTL not available"; close(fd); fd = INVALID_HANDLE_VALUE; return ret_val; } else { flags &= ~(TIOCM_RTS | TIOCM_DTR); if (ioctl(fd, TIOCMSET, &flags) == -1) { qDebug() << "RS232Interface::OpenPort IOCTL not available"; close(fd); fd = INVALID_HANDLE_VALUE; return ret_val; } } #endif /*TIOCMGET */ qDebug() << "RS232Interface::OpenPort GETATTR"; if (tcgetattr(fd, &old_termios) == -1) { qDebug() << "RS232Interface::OpenPort GETATTR failed"; close(fd); fd = INVALID_HANDLE_VALUE; return ret_val; } qDebug() << "RS232Interface::OpenPort SetTimeouts && Params"; if (SetSerialTimeouts() != OK) { qDebug() << "RS232Interface::OpenPort SetSerialTimeouts() failed"; close(fd); fd = INVALID_HANDLE_VALUE; } else if (SetSerialParams() != OK) { qDebug() << "RS232Interface::OpenPort SetSerialParams() failed"; close(fd); fd = INVALID_HANDLE_VALUE; } else { fd_clear_flag(fd, O_NONBLOCK); //Restore to blocking mode ret_val = OK; } #endif /*Q_OS_LINUX*/ qDebug() << "RS232Interface::OpenSerial() = " << ret_val << " O"; return ret_val; } void RS232Interface::CloseSerial() { qDebug() << "RS232Interface::CloseSerial()"; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { // SetCommState(hCom, &old_dcb); //This can raise the RTS line, so invalidating the PowerOff SetCommTimeouts(hCom, &old_timeout); SetCommMask(hCom, old_mask); PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); CloseHandle(hCom); hCom = INVALID_HANDLE_VALUE; } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { // tcsetattr(fd, TCSAFLUSH, &old_termios); //This can raise the RTS line, so invalidating the PowerOff close(fd); fd = INVALID_HANDLE_VALUE; } #endif } int RS232Interface::SetSerialBreak(int state) { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { if (state) { SetCommBreak(hCom); } else { ClearCommBreak(hCom); } result = OK; } #elif defined(Q_OS_LINUX) #if defined(TIOCSBRK) && defined(TIOCCBRK) //check if available for compilation if (state) { result = ioctl(fd, TIOCSBRK, 0); } else { result = ioctl(fd, TIOCCBRK, 0); } #else qDebug() << "RS232Interface::SetSerialBreak Can't get IOCTL"; #endif #endif return result; } /** void RS232Interface::SetSerialEventMask(long mask) { #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE ) SetCommMask(hCom, mask); #endif } **/ void RS232Interface::SerialFlushRx() { #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { PurgeComm(hCom, PURGE_RXCLEAR); } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { tcflush(fd, TCIFLUSH); } #endif } void RS232Interface::SerialFlushTx() { #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { PurgeComm(hCom, PURGE_TXCLEAR); } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { tcflush(fd, TCOFLUSH); } #endif } void RS232Interface::WaitForTxEmpty() { #ifdef Q_OS_WIN32 DWORD evento; if (hCom != INVALID_HANDLE_VALUE) { do { WaitCommEvent(hCom, &evento, NULL); } while (!(evento & EV_TXEMPTY)); } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { tcdrain(fd); } #endif } long RS232Interface::ReadSerial(uint8_t *buffer, long len) { long retval = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { DWORD nread; if (ReadFile(hCom, buffer, len, &nread, NULL)) { retval = nread; } } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { long nread, nleft; uint8_t *ptr; nleft = len; ptr = buffer; /* Wait up to N seconds. */ struct timeval tv; tv.tv_sec = read_total_timeout / 1000; tv.tv_usec = (read_total_timeout % 1000) * 1000; while (nleft > 0) { fd_set rfds; int rval; /* Watch file fd to see when it has input. */ FD_ZERO(&rfds); FD_SET(fd, &rfds); rval = select(fd + 1, &rfds, NULL, NULL, &tv); if (rval < 0) //Error { nleft = -1; break; } else if (rval == 0) //Timeout { nleft = -1; retval = E2P_TIMEOUT; break; } else //Ok { nread = read(fd, ptr, nleft); if (nread < 0) { nleft = -1; break; //Error } } nleft -= nread; ptr += nread; } if (nleft >= 0) { retval = (len - nleft); } } #endif return retval; } long RS232Interface::WriteSerial(uint8_t *buffer, long len) { long retval = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { DWORD nwrite; if (WriteFile(hCom, buffer, len, &nwrite, NULL)) { retval = nwrite; } } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { long nleft; uint8_t *ptr; ptr = buffer; nleft = len; while (nleft > 0) { long nwritten = write(fd, ptr, nleft); if (nwritten <= 0) { return retval; //return error } nleft -= nwritten; ptr += nwritten; } retval = len; } #endif if (wait_endTX_mode) { WaitForTxEmpty(); } return retval; } // -1 ---> Not Change int RS232Interface::SetSerialParams(long speed, int bits, int parity, int stops, int flow_control) { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { if (speed >= 300 && speed <= 115200) { actual_speed = speed; } if (bits >= 1 && bits <= 16) { actual_bits = bits; } if (parity == 'N' || parity == 'E' || parity == 'O') { actual_parity = parity; } if (stops >= 1 && stops <= 2) { actual_stops = stops; } if (flow_control >= 0 && flow_control <= 2) { actual_flowcontrol = flow_control; } QString dcb_str; DCB com_dcb; if (GetCommState(hCom, &com_dcb)) { dcb_str.sprintf("baud=%ld parity=%c data=%d stop=%d", actual_speed, actual_parity, actual_bits, actual_stops); // dcb_str[255] = '\0'; if (BuildCommDCB((LPCWSTR)dcb_str.utf16(), &com_dcb)) { if (actual_flowcontrol == 0) { com_dcb.fDtrControl = DTR_CONTROL_DISABLE; com_dcb.fRtsControl = RTS_CONTROL_DISABLE; } if (SetCommState(hCom, &com_dcb)) { result = OK; } else { result = GetLastError(); } PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); } } } #elif defined(Q_OS_LINUX) if (fd != INVALID_HANDLE_VALUE) { if (speed >= 300 && speed <= 115200) { actual_speed = speed; } if (bits >= 1 && bits <= 16) { actual_bits = bits; } if (parity == 'N' || parity == 'E' || parity == 'O') { actual_parity = parity; } if (stops >= 1 && stops <= 2) { actual_stops = stops; } if (flow_control >= 0 && flow_control <= 2) { actual_flowcontrol = flow_control; } struct termios termios; if (tcgetattr(fd, &termios) != 0) { return result; } cfmakeraw(&termios); termios.c_cflag |= CLOCAL; //Disable modem status line check //Flow control if (actual_flowcontrol == 0) { termios.c_cflag &= ~CRTSCTS; //Disable hardware flow control termios.c_iflag &= ~(IXON | IXOFF); //Disable software flow control } else if (actual_flowcontrol == 1) { termios.c_cflag |= CRTSCTS; termios.c_iflag &= ~(IXON | IXOFF); } else { termios.c_cflag &= ~CRTSCTS; termios.c_iflag |= (IXON | IXOFF); } //Set size of bits termios.c_cflag &= ~CSIZE; if (actual_bits <= 5) { termios.c_cflag |= CS5; } else if (actual_bits == 6) { termios.c_cflag |= CS6; } else if (actual_bits == 7) { termios.c_cflag |= CS7; } else { termios.c_cflag |= CS8; } //Set stop bits if (actual_stops == 2) { termios.c_cflag |= CSTOPB; } else { termios.c_cflag &= ~CSTOPB; } //Set parity bit if (actual_parity == 'N') { termios.c_cflag &= ~PARENB; } else if (actual_parity == 'E') { termios.c_cflag |= PARENB; termios.c_cflag &= ~PARODD; } else { //'O' termios.c_cflag |= (PARENB | PARODD); } //Set speed speed_t baudrate; switch (speed) { case 300: baudrate = B300; break; case 600: baudrate = B600; break; case 1200: baudrate = B1200; break; case 2400: baudrate = B2400; break; case 4800: baudrate = B4800; break; case 9600: baudrate = B9600; break; case 19200: baudrate = B19200; break; case 38400: baudrate = B38400; break; case 57600: baudrate = B57600; break; case 115200: baudrate = B115200; break; case 230400: baudrate = B230400; break; default: baudrate = B9600; break; } cfsetispeed(&termios, baudrate); cfsetospeed(&termios, baudrate); termios.c_cc[VMIN] = 1; termios.c_cc[VTIME] = 0; if (tcsetattr(fd, TCSANOW, &termios) == 0) { result = OK; } } #endif return result; } //At the moment the while_read (interval timeout) is not used with Linux int RS232Interface::SetSerialTimeouts(long init_read, long while_read) { long result = E2ERR_OPENFAILED; if (while_read >= 0) { read_interval_timeout = while_read; } if (init_read >= 0) { read_total_timeout = init_read; } #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { COMMTIMEOUTS new_timeout; // new_timeout = old_timeout; /* * Set to asynchronous mode: the read operation is to * return immediately with the characters that have * already been received, even if no characters have * been received. * * ReadIntervalTimeout = MAXDWORD; * ReadTotalTimeoutMultiplier = 0; * ReadTotalTimeoutConstant = 0; */ /* * Windows 95: Set to UNIX read() syscall behaviour * * ReadIntervalTimeout = MAXDWORD; * readTotalTimeoutMultiplier = MAXDWORD; * ReadTotalTimeoutConstant = X (X > 0 && X < MAXDWORD) */ new_timeout.ReadIntervalTimeout = read_interval_timeout; new_timeout.ReadTotalTimeoutMultiplier = 0; new_timeout.ReadTotalTimeoutConstant = read_total_timeout; //Disable write timeouts new_timeout.WriteTotalTimeoutMultiplier = 0; new_timeout.WriteTotalTimeoutConstant = 0; if (SetCommTimeouts(hCom, &new_timeout)) { result = OK; } } #elif defined(Q_OS_LINUX) result = OK; #endif return result; } int RS232Interface::SetSerialDTR(int dtr) { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { if (EscapeCommFunction(hCom, dtr ? SETDTR : CLRDTR)) { result = OK; } } #elif defined(Q_OS_LINUX) int flags; ioctl(fd, TIOCMGET, &flags); if (dtr) { flags |= TIOCM_DTR; } else { flags &= ~TIOCM_DTR; } result = ioctl(fd, TIOCMSET, &flags); #endif return result; } int RS232Interface::SetSerialRTS(int rts) { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { if (EscapeCommFunction(hCom, rts ? SETRTS : CLRRTS)) { result = OK; } } #elif defined(Q_OS_LINUX) int flags; ioctl(fd, TIOCMGET, &flags); if (rts) { flags |= TIOCM_RTS; } else { flags &= ~TIOCM_RTS; } result = ioctl(fd, TIOCMSET, &flags); #endif return result; } int RS232Interface::SetSerialRTSDTR(int state) { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { if (state) { EscapeCommFunction(hCom, SETRTS); EscapeCommFunction(hCom, SETDTR); } else { EscapeCommFunction(hCom, CLRRTS); EscapeCommFunction(hCom, CLRDTR); } result = OK; } #elif defined(Q_OS_LINUX) int flags; ioctl(fd, TIOCMGET, &flags); if (state) { flags |= (TIOCM_RTS | TIOCM_DTR); } else { flags &= ~(TIOCM_RTS | TIOCM_DTR); } result = ioctl(fd, TIOCMSET, &flags); #endif return result; } int RS232Interface::GetSerialDSR() const { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { DWORD status; if (GetCommModemStatus(hCom, &status)) { result = (status & MS_DSR_ON); } } #elif defined(Q_OS_LINUX) int flags; if (ioctl(fd, TIOCMGET, &flags) != -1) { result = (flags & TIOCM_DSR); } #endif return result; } int RS232Interface::GetSerialCTS() const { int result = E2ERR_OPENFAILED; #ifdef Q_OS_WIN32 if (hCom != INVALID_HANDLE_VALUE) { DWORD status; if (GetCommModemStatus(hCom, &status)) { result = (status & MS_CTS_ON); } } #elif defined(Q_OS_LINUX) int flags; if (ioctl(fd, TIOCMGET, &flags) != -1) { result = (flags & TIOCM_CTS); } #endif return result; } #ifdef Q_OS_LINUX static int fd_clear_flag(int fd, int flags) { int val; if ((val = fcntl(fd, F_GETFL, 0)) < 0) { return val; } val &= ~flags; if (fcntl(fd, F_SETFL, val) < 0) { return -1; } return 0; } #endif tmp9balx013/SrcPony/e2401.cpp0000644000175000017500000001131013616566001015556 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "e2awinfo.h" #include "e2401.h" // Header file #include "errcode.h" #include "eeptypes.h" #include mE2401::mE2401(e2AppWinInfo *wininfo, BusIO *busp, int def_banksize) : Device(wininfo, busp, def_banksize), timeout_loop(200), sequential_read(1), // lettura di un banco alla volta writepage_size(1) // scrittura di un byte alla volta (no page write) { } //Determina a quali indirizzi I2C si mappa, e // se probe_size == 1 anche la dimensione (numero di banchi) int mE2401::Probe(int probe_size) { int retval = 1; uint8_t ch; qDebug() << "mE2401::Probe(" << probe_size << ") - IN"; if (GetBus()->Read(0, &ch, 1) != 1) { retval = GetBus()->Error(); if (retval == IICERR_NOADDRACK) { retval = 0; } } qDebug() << "mE2401::Probe(" << probe_size << ") - OUT"; return retval; } int mE2401::Read(int probe, int type) { long size = GetSize(); int error = Probe(probe); if (error < 0) { return error; } GetBus()->ReadStart(); if (type & PROG_TYPE) { if (sequential_read) { if (GetBus()->Read(0, GetBufPtr(), size) < size) { return GetBus()->Error(); } } else { int k; for (k = 0; k < size; k++) { if (GetBus()->Read(k, GetBufPtr() + k, 1) != 1) { return GetBus()->Error(); } if (GetBus()->ReadProgress((k + 1) * 100 / size)) { return OP_ABORTED; } } } } GetBus()->ReadEnd(); return size; } int mE2401::Write(int probe, int type) { long size = GetSize(); int error = Probe(probe); if (error < 0) { return error; } GetBus()->WriteStart(); if (type & PROG_TYPE) { int j; uint8_t ch; for (j = 0; j < size; j += writepage_size) { if (GetBus()->Write(j, GetBufPtr() + j, writepage_size) != writepage_size) { return GetBus()->Error(); } int k; for (k = timeout_loop; k > 0 && GetBus()->Read(j, &ch, 1) != 1; k--) ; if (k == 0) { return E2P_TIMEOUT; } if (GetBus()->WriteProgress((j + 1) * 100 / size)) { return OP_ABORTED; } } } GetBus()->WriteEnd(); return size; } int mE2401::Verify(int type) { Probe(); long size = GetSize(); unsigned char *localbuf = new unsigned char[size]; GetBus()->ReadStart(); int rval = 1; if (type & PROG_TYPE) { if (sequential_read) { if (GetBus()->Read(0, localbuf, size) < size) { return GetBus()->Error(); } } else { int k; for (k = 0; k < size; k++) { if (GetBus()->Read(k, localbuf + k, 1) != 1) { rval = GetBus()->Error(); break; } if (GetBus()->ReadProgress((k + 1) * 100 / size)) { rval = OP_ABORTED; break; } } } if (memcmp(GetBufPtr(), localbuf, size) != 0) { rval = 0; } } GetBus()->ReadEnd(); delete[] localbuf; return rval; } tmp9balx013/SrcPony/lpt_ext_interf.h0000644000175000017500000000632213616566001017525 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _LPT_EXT_INTERFACE_H #define _LPT_EXT_INTERFACE_H #include "businter.h" #include "lptinterf.h" #include "lpt_io_interf.h" class LptExtInterface : public BusInterface { public: LptExtInterface(bool use_io = false) { io_mode = use_io; } virtual ~LptExtInterface() { } void Close() { lptio.Close(); lpt.Close(); } void SetIOmode(bool use_io) { io_mode = use_io; } protected: int InDataPort(int port_no = -1) { return io_mode ? lptio.InDataPort(port_no) : lpt.InDataPort(port_no); } int OutDataPort(int val, int port_no = -1) { return io_mode ? lptio.OutDataPort(val, port_no) : lpt.OutDataPort(val, port_no); } int OutControlPort(int val, int port_no = -1) { return io_mode ? lptio.OutControlPort(val, port_no) : lpt.OutControlPort(val, port_no); } int OutDataMask(int mask, int val) { return io_mode ? lptio.OutDataMask(mask, val) : lpt.OutDataMask(mask, val); } int OutControlMask(int mask, int val) { return io_mode ? lptio.OutControlMask(mask, val) : lpt.OutControlMask(mask, val); } int GetLastData() const { return io_mode ? lptio.GetLastData() : lpt.GetLastData(); } int GetLastCtrl() const { return io_mode ? lptio.GetLastCtrl() : lpt.GetLastCtrl(); } private: static LPTInterface lpt; static LPTIOInterface lptio; bool io_mode; }; #endif tmp9balx013/SrcPony/picbus.h0000644000175000017500000000720013616566001015760 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PICBUS_H #define _PICBUS_H #include "busio.h" #include "pgminter.h" class PicBus : public BusIO { public: PicBus(BusInterface *ptr = 0); //virtual ~PicBus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); int Erase(int type = ALL_TYPE); int Reset(); long ReadConfig(uint16_t *data); long WriteConfig(uint16_t *data); void DisableCodeProtect(); int CompareSingleWord(uint16_t data1, uint16_t data2, uint16_t mask); int CompareMultiWord(uint8_t *data1, uint8_t *data2, long length, int split); void SetDelay(); protected: int SendDataWord(long wo, int wlen = 16); long RecDataWord(int wlen = 16); int WaitReadyAfterWrite(long timeout = 5000); int SendCmdCode(int opcode); int SendProgCode(uint16_t data); uint16_t RecvProgCode(); int SendDataCode(uint16_t data); uint16_t RecvDataCode(); void SetMCLR() { busI->SetControlLine(1); } void ClearMCLR() { busI->SetControlLine(0); } const uint16_t DataMask; const uint16_t ProgMask; //Command Opcode const uint8_t ReadProgCode; const uint8_t LoadProgCode; const uint8_t ReadDataCode; const uint8_t LoadDataCode; const uint8_t LoadConfigCode; const uint8_t IncAddressCode; const uint8_t EraseProgMem; const uint8_t EraseDataMem; const uint8_t BeginEraseProgCode; const uint8_t BeginProgOnlyCode; private: int SendDataBit(int b); int RecDataBit(); void bitDI(int b) { busI->SetInvDataOut(b); } void setDI() { busI->SetInvDataOut(1); } void clearDI() { busI->SetInvDataOut(0); } void setCLK() { busI->SetClock(1); } void clearCLK() { busI->SetClock(0); } int getDO() const { return busI->GetDataIn(); } }; #endif tmp9balx013/SrcPony/picbusnew.h0000644000175000017500000000432113616566001016473 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PICBUSNEW_H #define _PICBUSNEW_H #include "picbus.h" class PicBusNew : public PicBus { public: PicBusNew(BusInterface *ptr = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); protected: int WaitReadyAfterWrite(long timeout = 5000); private: }; #endif tmp9balx013/SrcPony/rs232int.h0000644000175000017500000000637213616566001016072 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _RS232INTERFACE_H #define _RS232INTERFACE_H #include #ifdef Q_OS_LINUX #include #endif #ifdef Q_OS_WIN32 #include #endif #include "types.h" #include "e2profil.h" //#define MAX_COMPORTS 64 class RS232Interface { public: RS232Interface(); virtual ~RS232Interface(); int OpenSerial(int no); int OpenSerial(QString devname); void CloseSerial(); void SerialFlushRx(); void SerialFlushTx(); long ReadSerial(uint8_t *buffer, long len); long WriteSerial(uint8_t *buffer, long len); int SetSerialParams(long speed = -1, int bits = -1, int parity = -1, int stops = -1, int flow_control = -1); int SetSerialTimeouts(long init_read = -1, long while_read = -1); // void SetSerialEventMask(long mask); int SetSerialBreak(int state); int SetSerialDTR(int dtr); int SetSerialRTS(int rts); int GetSerialDSR() const; int GetSerialCTS() const; int SetSerialRTSDTR(int state); protected: void WaitForTxEmpty(); private: QString m_devname; long read_total_timeout, read_interval_timeout; long actual_speed; int actual_bits, actual_parity, actual_stops; int actual_flowcontrol; bool wait_endTX_mode; // E2Profile *profile; #ifdef Q_OS_WIN32 HANDLE hCom; DWORD old_mask; COMMTIMEOUTS old_timeout; DCB old_dcb; #elif defined(Q_OS_LINUX) int fd; struct termios old_termios; #endif }; #endif tmp9balx013/SrcPony/at250bus2.h0000644000175000017500000000533413616566001016130 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT250BIGBUS_H #define _AT250BIGBUS_H #include "at250bus.h" class At250BigBus: public At250Bus { public: At250BigBus(BusInterface *ptr = 0); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); // int Reset(); protected: // int ReadEEPByte(int addr); // void WriteEEPByte(int addr, int data); private: //Programming commands // const uint8_t WriteEnable; // const uint8_t WriteDisable; // const uint8_t ReadStatus; // const uint8_t WriteStatus; // const uint8_t ReadData; // const uint8_t WriteData; //Status flags // const uint8_t NotReadyFlag; // const uint8_t WenFlag; // const uint8_t BPFlags; // const loop_timeout; }; #endif tmp9balx013/SrcPony/portint.h0000644000175000017500000001011613616566001016172 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PORTINTERFACE_H #define _PORTINTERFACE_H #include #include "types.h" #ifdef Q_OS_WIN32 #include typedef void (__stdcall *lpOut32)(short, short); typedef short(__stdcall *lpInp32)(short); typedef BOOL (__stdcall *lpIsInpOutDriverOpen)(void); typedef BOOL (__stdcall *lpIsXP64Bit)(void); #endif // Maximum number of printer ports that would be installed on a system #define MAX_LPTPORTS 4 #define MAX_COMPORTS 8 struct base_len { unsigned int base, len; }; class PortInterface { public: PortInterface(); virtual ~PortInterface(); int OpenPort(const base_len *ports); void ClosePort(); int OpenSerial(int no); void CloseSerial(); int OpenParallel(int no); void CloseParallel(); int GetFirstPort() const { return first_port; } int GetLastPort() const { return last_port; } int GetNoPorts() const { return no_ports; } int GetSerBasePort(int no); int GetParBasePort(int no); virtual int InPort(int no = -1) const; virtual int OutPort(int val, int no = -1); virtual int OutPortMask(int mask, int val); protected: uint8_t GetCPWReg() { return cpwreg; } #ifdef Q_OS_WIN32 HANDLE hCom; #endif int write_port, // Number of output port (write I/O port address) read_port; // Number of input port (read I/O port address) uint8_t cpwreg; // write register image in memory (the content is the same of the hardware register) private: int IOperm(int a, int b, int c); void DetectPorts(); #ifdef Q_OS_WIN32 //void DetectPorts9x(); // Win9x version void DetectLPTPortsNT(); // WinNT/2000 version void DetectCOMPortsNT(); // WinNT/2000 version int LPTCount; //Number of LPT ports on the system int COMCount; //Number of COM ports on the system DWORD old_mask; HINSTANCE hInpOutDll; //Some global function pointers (messy but fine for an example) lpOut32 gfpOut32; lpInp32 gfpInp32; lpIsInpOutDriverOpen gfpIsInpOutDriverOpen; lpIsXP64Bit gfpIsXP64Bit; #else int lcr_copy; int ier_copy; #endif int first_port; int last_port; int no_ports; base_len ser_ports[MAX_COMPORTS]; base_len par_ports[MAX_LPTPORTS]; }; #endif tmp9balx013/SrcPony/aboutmdlg.cpp0000644000175000017500000000772513616566001017020 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include "version.h" #include "aboutmdlg.h" #include "e2profil.h" static const QString AUTHORWEB = "http://www.LancOS.com"; static const QString COPYRIGHTYEAR = "1997-2020"; static const QString PORTERGQT = "Eduard Kalinowski"; static const QString PORTERMAIL = "eduard_kalinowski@yahoo.de"; AboutModalDialog::AboutModalDialog(QWidget *bw, const QString title) : QDialog(bw) { qDebug() << "AboutModalDialog::AboutModalDialog()"; setupUi(this); setWindowTitle(title); cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } lblAbout0->setText(APP_NAME " - " + translate(STR_APPNAME_EXT) + "
" + translate(STR_MSGVERSION) + " " APP_VERSION " " __DATE__); QString t = "Copyright (C) " + COPYRIGHTYEAR + " by " APP_AUTHOR "

" + "Porting to Qt4/Qt5 by " + PORTERGQT + "

" + translate(STR_APPDOWNLOAD1) + " " APP_NAME " " + translate(STR_APPDOWNLOAD2) + "
" + "" + AUTHORWEB + ""; if (translate(MSG_TRANSLATORNAME).length() > 0) { t += "

" + translate(MSG_TRANSLATORCREDITS) + "
" + translate(MSG_TRANSLATORNAME).replace("\n", "
"); } lblAbout1->setText(t); chkSound->setChecked(E2Profile::GetSkipStartupDialog()); chkSound->setText(translate(STR_LBLSKIPMSG)); pushOk->setText(translate(STR_BTNOK)); pushHelp->setText(translate(STR_BTNHELP)); icoPonyProg->setPixmap(QPixmap(":/icons/ponyprog.png")); connect(pushOk, SIGNAL(clicked()), this, SLOT(accept())); connect(pushHelp, SIGNAL(clicked()), this, SLOT(onHelp())); connect(chkSound, SIGNAL(clicked(bool)), this, SLOT(onChkStart(bool))); adjustSize(); } AboutModalDialog::~AboutModalDialog() { qDebug() << "AboutModalDialog::~AboutModalDialog()"; } void AboutModalDialog::onHelp() { cmdw->CmdHelp(); accept(); } void AboutModalDialog::onChkStart(bool c) { E2Profile::SetSkipStartupDialog(c); } tmp9balx013/SrcPony/filldlg.h0000644000175000017500000000473113616566001016116 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef FillDIALOG_H #define FillDIALOG_H #include #include #include #include "Translator.h" #include "ui_editdlg.h" class FillDialog : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: FillDialog(QWidget *bw, long &cfrom, long &cto, int &cval, long max_addr, const QString title = translate(STR_LBLFILLBUF)); virtual ~FillDialog(); // Destructor protected: private slots: void onOk(); private: long *pFrom, *pTo; int *pVal; long mFrom, mTo; int mVal; long mMax; }; #endif tmp9balx013/SrcPony/motsfbuf.h0000644000175000017500000000532213616566001016323 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// //Read/Write Motorola Srecord file format #ifndef _MOTOSFBUF_H #define _MOTOSFBUF_H #include #include "types.h" #include "filebuf.h" class MotorolaSFileBuf : public FileBuf { public: MotorolaSFileBuf(e2AppWinInfo *wininfo = 0); //virtual ~MotorolaSFileBuf(); virtual int Load(int loadtype = ALL_TYPE, long relocation_offset = 0); virtual int Save(int savetype = ALL_TYPE, long relocation_offset = 0); protected: private: int WriteRecord(QTextStream &outs, uint8_t *bptr, long curaddr, long recsize, int fmt); int ParseRecord(char *lbufPC, uint8_t *buf_startP, uint8_t *buf_endP, long offset, int nocopy); uint8_t *highestPC; unsigned long highestAddr; unsigned long lowestAddr; int valid_record_count; //incremented by ParseRecord for each valid record found }; #endif tmp9balx013/SrcPony/x2444.h0000644000175000017500000000456713616566001015275 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _X2444_H #define _X2444_H #include "types.h" #include "x2444bus.h" #include "device.h" class X2444 : public Device { public: X2444(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); virtual void DefaultBankSize(); protected: X2444Bus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/businter.h0000644000175000017500000002173313616566001016335 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _BUSINTERFACE_H #define _BUSINTERFACE_H #include "types.h" #include "errcode.h" #include "wait.h" #include "globals.h" #include "interfconv.h" #include //Some useful flags #define SPIMODE_CPHA 0x01 // clock phase/edge #define SPIMODE_CPOL 0x02 // clock polarity #define SPIMODE_MASK 0x03 #define xMODE_RDONLY 0x04 #define xMODE_WRONLY 0x08 //#define I2CMODE_MASK 0x10 enum { SPI_MODE_0 = (0 | 0), SPI_MODE_1 = (0 | SPIMODE_CPHA), SPI_MODE_2 = (SPIMODE_CPOL | 0), SPI_MODE_3 = (SPIMODE_CPOL | SPIMODE_CPHA) }; #define SCLTIMEOUT 900 // enable SCL check and timing (for slaves that hold down the SCL line to slow the transfer) class BusInterface { public: BusInterface() : old_portno(-1), usb_vp(0), installed(-1), cmd2cmd_delay(0), shot_delay(5), i2c_mode(false) { } virtual int Open(int port) = 0; virtual void Close() = 0; virtual int TestOpen(int port) { qDebug() << Q_FUNC_INFO << "(" << port << ") IN"; int ret_val = TestSave(port); TestRestore(); qDebug() << Q_FUNC_INFO << "=" << ret_val << " OUT"; return ret_val; } virtual int TestPort(int port) { qDebug() << Q_FUNC_INFO << "(" << port << ") IN"; return TestOpen(port); } virtual int TestSave(int port) { int ret_val; qDebug() << Q_FUNC_INFO << "(" << port << ") IN"; old_portno = installed; Close(); if ((ret_val = Open(port)) == OK) { } qDebug() << Q_FUNC_INFO << "=" << ret_val << " OUT"; return ret_val; } virtual void TestRestore() { qDebug() << Q_FUNC_INFO << "IN *** Inst=" << installed; if (IsInstalled()) { Close(); } if (old_portno >= 0) { Open(old_portno); old_portno = -1; } qDebug() << Q_FUNC_INFO << "OUT"; } virtual int SetPower(bool onoff) { return OK; } virtual void SetControlLine(int res = 1) { } virtual void SetDataOut(int sda = 1) = 0; virtual void SetInvDataOut(int sda = 1) { SetDataOut(!sda); } virtual void SetClock(int scl = 1) = 0; virtual int GetDataIn() = 0; virtual int GetClock() = 0; virtual void SetClockData() = 0; virtual void ClearClockData() { } virtual int IsClockDataUP() = 0; virtual int IsClockDataDOWN() = 0; virtual bool CheckDataLines(int len = 1, int sda = -1, int scl = -1) { bool test = false; if (len > 0) { do { if (sda == 0 && scl == 0) { test = IsClockDataDOWN(); } else if (sda > 0 && scl > 0) { test = IsClockDataUP(); } else { bool test_sda = true, test_scl = true; if (sda > 0) { test_sda = GetDataIn(); } else if (sda == 0) { test_sda = !GetDataIn(); } if (scl > 0) { test_scl = GetClock(); } else if (scl == 0) { test_scl = !GetClock(); } test = (test_sda && test_scl); } } while (test && --len > 0); } return test; } int GetCmd2CmdDelay() const { return cmd2cmd_delay; } void SetCmd2CmdDelay(int delay) { if (delay >= 0) { cmd2cmd_delay = delay; } } bool IsInstalled() const { return (installed >= 0) ? true : false; } void SetUSBVidPid(VidPid vp) { usb_vp = vp; } VidPid GetUSBVid() { return usb_vp; } virtual void WaitMsec(unsigned int msec) { Flush(); w.WaitMsec(msec); } virtual void WaitUsec(unsigned int usec) { Flush(); w.WaitUsec(usec); } virtual void ShotDelay(int n = 1) { w.WaitUsec(shot_delay * n); } virtual int xferBit(int &err, int b, int mode = 0) { int ret = 0; if (!i2c_mode) //(mode & I2CMODE_MASK) == 0) { switch (mode & SPIMODE_MASK) { case 3: SetClock(0); SetDataOut(b); ShotDelay(); SetClock(1); if ((mode & xMODE_WRONLY) == 0) { ret = GetDataIn(); } ShotDelay(); break; case 2: SetDataOut(b); ShotDelay(); SetClock(0); if ((mode & xMODE_WRONLY) == 0) { ret = GetDataIn(); } ShotDelay(); SetClock(1); break; case 1: SetClock(1); SetDataOut(b); ShotDelay(); SetClock(0); if ((mode & xMODE_WRONLY) == 0) { ret = GetDataIn(); } ShotDelay(); break; case 0: default: SetDataOut(b); ShotDelay(); SetClock(1); if ((mode & xMODE_WRONLY) == 0) { ret = GetDataIn(); } ShotDelay(); SetClock(0); break; } } else { //I2CBus SetDataOut(b); // SDA must be high to receive data (low dominant) ShotDelay(); // tSU;DAT = 250 nsec (tLOW / 2 = 2 usec) SetClock(1); #ifdef SCLTIMEOUT for (int k = SCLTIMEOUT; GetClock() == 0 && k > 0; k--) { WaitUsec(1); } if (GetClock() == 0) { return IICERR_SCLCONFLICT; } #endif ShotDelay(); // tHIGH / 2 = 2 usec if ((mode & xMODE_WRONLY) == 0) { ret = GetDataIn(); } ShotDelay(); // tHIGH / 2 = 2 usec SetClock(0); ShotDelay(); // tHD;DATA = 300 nsec (tLOW / 2 = 2 usec) } err = OK; return ret; } virtual uint8_t xferByte(int &err, uint8_t by, int mode = 0, int bpw = 8, bool lsb_first = false) { return (uint8_t)xferWord(err, by, mode, bpw, lsb_first); } virtual unsigned long xferWord(int &err, unsigned long word_out, int mode = 0, int bpw = 8, bool lsb_first = false) { uint32_t word_in = 0; uint32_t bitmask; err = OK; if (!i2c_mode) //if ((mode & I2CMODE_MASK) == 0) { switch (mode & SPIMODE_MASK) { case 3: case 2: SetClock(1); break; case 1: case 0: default: SetClock(0); break; } } if (lsb_first) { bitmask = 1; } else { bitmask = 1 << (bpw - 1); } for (int k = 0; k < bpw; k++) { if (xferBit(err, word_out & bitmask, mode)) { word_in |= bitmask; } if (lsb_first) { bitmask <<= 1; } else { bitmask >>= 1; } } SetDataOut(1); return word_in; } virtual void SetDelay(int delay) { if (delay >= 0) { shot_delay = delay; } } int GetDelay() const { return shot_delay; } void SetI2CMode(bool mode) { i2c_mode = mode; } bool GetI2CMode() const { return i2c_mode; } virtual void ConfigPins(int pinum_ctrl = -1, int pinum_datain = -1, int pinum_dataout = -1, int pinum_clock = -1, int pinum_clockin = -1, int pinum_poweron = -1, int pinum_enbus = -1, int pinnum_ctrlin = -1) { pins.ctrl = pinum_ctrl; pins.datain = pinum_datain; pins.dataout = pinum_dataout; pins.clock = pinum_clock; pins.ctrlin = pinnum_ctrlin; pins.clockin = pinum_clockin; pins.poweron = pinum_poweron; pins.enbus = pinum_enbus; } virtual void ConfigPins(InterfPins p) { ConfigPins(p.ctrl, p.datain, p.dataout, p.clock, p.clockin, p.poweron, p.enbus, p.ctrlin); } protected: void Install(int val) { installed = val; } void DeInstall() { installed = -1; } int GetInstalled() const { return installed; } virtual int Flush() { return OK; } int old_portno; // TestSave() save the status here VidPid usb_vp; Wait w; InterfPins pins; private: int installed; // -1 --> not installed, >= 0 number if the installed port int cmd2cmd_delay; // <> 0 if a delay between commands is needed unsigned int shot_delay; //delay unit to perform bus timing bool i2c_mode; }; #endif tmp9balx013/SrcPony/csmfbuf.cpp0000644000175000017500000001415513616566001016462 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include "csmfbuf.h" // Header file #include "crc.h" #include "errcode.h" csmFileBuf::csmFileBuf(e2AppWinInfo *wininfo) : FileBuf(wininfo) { file_type = CSM; } #define MAXLINE 1023 int csmFileBuf::Load(int loadtype, long relocation_offfset) { extern int GetE2PSubType(unsigned long x); extern int GetE2PPriType(unsigned long x); (void)relocation_offfset; //unused QFile fh(FileBuf::GetFileName()); int rval = OK; if (!fh.open(QIODevice::ReadOnly | QIODevice::Text)) { return FILENOTFOUND; } int state = 0; QTextStream stream(&fh); while (!fh.atEnd() && state < 3) { QString riga = stream.readLine(); int pos = -1; switch (state) { case 0: //look for header start if ((pos = riga.indexOf('\"')) >= 0) { state++; if ((pos = riga.indexOf("REFERENCE", pos + 1)) >= 0) { state++; if ((pos = riga.indexOf('\"', pos + 1)) >= 0) { state++; } } } break; case 1: //look for "REFERENCE" if ((pos = riga.indexOf("REFERENCE")) >= 0) { state++; if ((pos = riga.indexOf('\"', pos + 1)) >= 0) { state++; } } break; case 2: //look for header terminator if ((pos = riga.indexOf('\"')) >= 0) { state++; } break; } } if (state < 3) //Header not found { rval = BADFILETYPE; } else { int okline_counter = 0; int addr, value; addr = 0; //read all remaining file (body) while (!fh.atEnd()) { QString riga = stream.readLine(); if (riga.length() > 0) // salta righe vuote { QStringList list = riga.split(" "); if (list.count() != 2) { rval = BADFILETYPE; break; } else { // n = sscanf(riga, "%x %x", &addr, &value); bool ok; addr = list.at(0).toInt(&ok, 16); if (ok == false) { rval = BADFILETYPE; break; } value = list.at(1).toInt(&ok, 16); if (ok == false) { rval = BADFILETYPE; break; } okline_counter++; } //carica valore nel buffer if (loadtype == ALL_TYPE) { if (addr < FileBuf::GetBufSize()) { FileBuf::GetBufPtr()[addr] = (uint8_t)value; } } else if (loadtype == PROG_TYPE) { long s = FileBuf::GetSplitted(); if (s <= 0) { s = FileBuf::GetBufSize(); } if (addr < s) { FileBuf::GetBufPtr()[addr] = (uint8_t)value; } } else if (loadtype == DATA_TYPE) { long s = FileBuf::GetSplitted(); if (s <= 0) { s = 0; } if (addr < FileBuf::GetBufSize() - s) { FileBuf::GetBufPtr()[addr + s] = (uint8_t)value; } } } } rval = addr; if (okline_counter == 0) { rval = BADFILETYPE; } } fh.close(); return rval; // SetStringID(hdr.e2pStringID); // SetComment(hdr.e2pComment); } static const char header[] = "REFERENCE = =\n" "CHASSIS = =\n" "MODEL = =\n" "SERIAL = =\n" "CUSTOMER NAME = =\n" "DATE = =\n" "STREET = =\n" "CITY = =\n" "STATE = =\n" "ZIP = =\n" "PHONE NUMBER = =\n" "CUSTOMER COMPLAINT = ="; int csmFileBuf::Save(int savetype, long relocation_offfset) { int rval = 0; (void) relocation_offfset; //unused long size = FileBuf::GetBlockSize() * FileBuf::GetNoOfBlock(); uint8_t *ptr = FileBuf::GetBufPtr(); if (savetype == PROG_TYPE) { if (GetSplitted() > 0 && GetSplitted() <= size) { size = GetSplitted(); } else { return 0; } } else if (savetype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < size) { ptr += GetSplitted(); size -= GetSplitted(); } else { return 0; } } if (size > 0) { QFile fh(FileBuf::GetFileName()); if (!fh.open(QIODevice::WriteOnly | QIODevice::Text)) { rval = CREATEERROR; } else { QTextStream out(&fh); int addr; //Write Header out << "\"\n" << header << "\n\""; //Write buffer for (addr = 0; addr < size; addr++) { int value = ptr[addr]; out << (hex) << addr << " " << value << "\n"; } fh.close(); rval = addr; } } else { rval = NOTHINGTOSAVE; } return rval; } tmp9balx013/SrcPony/ch341a.cpp0000644000175000017500000012561413616566001016023 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // https://github.com/lancos/ponyprog // // // // LibUSB implementation for PonyProg (C) 2019 Eduard Kalinowski // // // // sources: // // Copyright (C) 2014 Pluto Yang (yangyj.ee@gmail.com) // // https://github.com/setarcos/ch341prog // // // // Copyright (C) 2016 Eugene Hutorny (eugene@hutorny.in.ua) // // https://github.com/hutorny/usbuart // // // // Copyright (c) 2017 Gunar Schorcht (gunar@schorcht.net) // // https://github.com/gschorcht/spi-ch341-usb // // https://github.com/gschorcht/i2c-ch341-usb // // // // Copyright (c) 2018 Sarim Khan (sarim2005@gmail.com) // // https://github.com/sarim/ch341a-bitbang-userland // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include #include #include #include #include "ch341a.h" // int32_t bulkin_count; // set by the callback function #define DEBUG_CH341 0 struct sigaction saold; int force_stop = 0; uint32_t syncackpkt; // synch / ack flag used by BULK OUT cb function uint16_t byteoffset; // for read eeprom function int16_t ch341::read_completed = 0; int16_t ch341::write_completed = 0; /* SIGINT handler */ void sig_int(int signo) { force_stop = 1; } /** * ch341 requres LSB first, reverse the bit order before send and after receive * for more tricks, see https://graphics.stanford.edu/~seander/bithacks.html */ inline uint8_t ReverseByte(uint8_t c) { uint8_t result = 0; for (int i = 0; i < 8; ++i) { result = result << 1; result |= (c & 1); c = c >> 1; } return result; } inline uint16_t ReverseWord(uint16_t c) { uint16_t result = 0; for (int i = 0; i < 16; ++i) { result = result << 1; result |= (c & 1); c = c >> 1; } return result; } #if 0 static void read_cb(libusb_transfer *transfer) noexcept { switch (transfer->status) { case LIBUSB_TRANSFER_COMPLETED: if (transfer->user_data != NULL) { // TODO ReverseByte ??? } ch341::read_completed = 1; // bulkin_count++; break; default: qCritical("broken callback in transfer %p", transfer); ch341::read_completed = -1; // bulkin_count = -1; break; } } static void write_cb(libusb_transfer *transfer) noexcept { // file_channel *chnl = (file_channel *) transfer->user_data; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { qCritical("broken callback in transfer %p", transfer); ch341::write_completed = -1; } else { ch341::write_completed = 1; } } void ch34x_callback(libusb_transfer *transfer) { delete (unsigned char *)transfer->user_data; libusb_free_transfer(transfer); } #endif /** * @brief callback function from control transport change event */ #if 0 static void cb_ctrl_changed(struct libusb_transfer *transfer) { if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { qCritical("broken callback in transfer %p stat %d", transfer, transfer->status); } qCritical("async cb_ctrl_changed length=%d actual_length=%d state %d\n", transfer->length, transfer->actual_length, transfer->status); //libusb_free_transfer(transfer); // if (next_state() < 0) // request_exit(2); } #endif #if 0 /** * callback for bulk out async transfer */ void cbBulkOut(struct libusb_transfer *transfer) { if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { qCritical("cbBulkOut() error : %d", transfer->status); } syncackpkt = 1; } /** * callback for bulk in async transfer */ void cbBulkIn(struct libusb_transfer *transfer) { switch (transfer->status) { case LIBUSB_TRANSFER_COMPLETED: /* the first package has cmd and address info, so discard 4 bytes */ if (transfer->user_data != NULL) { for (int i = (bulkin_count == 0) ? 4 : 0; i < transfer->actual_length; ++i) { *((uint8_t *)transfer->user_data++) = ReverseByte(transfer->buffer[i]); } } bulkin_count++; break; default: qCritical("cbBulkIn() error : %d", transfer->status); libusb_free_transfer(transfer); bulkin_count = -1; } return; } #endif ch341::ch341(QObject *parent) { verbose = false; dtr = 0; rts = 0; baudRate = DEFAULT_BAUD_RATE; parity = 'N'; bits = 8; stops = 1; timeout = DEFAULT_TIMEOUT; devHandle = NULL; rtsCtsEnabled = 0; dtrDsrEnabled = 0; }; ch341::~ch341() { Release(); } void ch341::Close() { libusb_close(devHandle); devHandle = 0; } #if 0 void ch341::sendData(const uint8_t &data, size_t len) { struct libusb_transfer *transfer = libusb_alloc_transfer(0); unsigned char *buffer = new unsigned char[len]; memcpy(buffer, (const void *)data, len); libusb_fill_bulk_transfer(transfer, devHandle, CH341_DATA_OUT, buffer, len, ch34x_callback, buffer, 0); libusb_submit_transfer(transfer); } #endif void ch341::triggerBreak(uint msecs) { SetBreakControl(1); if (breakTimer) { breakTimer->stop(); delete breakTimer; } breakTimer = new QTimer(this); breakTimer->setSingleShot(true); connect(breakTimer, SIGNAL(timeout()), this, SLOT(breakTimeout())); breakTimer->start(msecs); } void ch341::breakTimeout() { SetBreakControl(0); } #if 0 void ch341::allocTransfer() { ctrl_transfer = libusb_alloc_transfer(0); // TODO is it right??? libusb_fill_control_setup(ctrl_buf, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, CH341_REQ_WRITE_REG, CH341_REG_STAT, 0, 0); printf("go2: ctrlbuf0-7]=0x%X-%X-%X-%X-%X-%X-%X-%X\n", ctrl_buf[0], ctrl_buf[1], ctrl_buf[2], ctrl_buf[3], ctrl_buf[4], ctrl_buf[5], ctrl_buf[6], ctrl_buf[7]); libusb_fill_control_transfer(ctrl_transfer, devHandle, ctrl_buf, cb_ctrl_changed, NULL, 0); ctrl_transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; } #endif /** * when 'verbose' enabled, print debug information */ void ch341::v_print(int mode, int len) // mode: begin=0, progress = 1 { static int size = 0; static time_t started, reported; int dur, done; if (!verbose) { return; } time_t now; time(&now); switch (mode) { case 0: // setup size = len; started = reported = now; break; case 1: // progress if (now == started) { return; } dur = now - started; done = size - len; if (done > 0 && reported != now) { qDebug("Bytes: %d (%d%c), Time: %d, ETA: %d ", done, (done * 100) / size, '%', dur, (int)((1.0 * dur * size) / done - dur)); fflush(stdout); reported = now; } break; case 2: // done dur = now - started; if (dur < 1) { dur = 1; } qDebug("Total: %d sec, average speed %d bytes per second.", dur, size / dur); break; break; } } int32_t ch341::GetStatusRx() { return read_completed; } int32_t ch341::GetStatusTx() { return write_completed; } int32_t ch341::Probe() { int32_t ret; uint8_t lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8; ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_LCR, lcr, NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_LCR\n"); return ret; } ret = SetBaudRate(baudRate); if (ret < 0) { return ret; } return 0; } #if 0 /* Helper function for libusb_bulk_transfer, display error message with the caller name */ int32_t ch341::Read(uint8_t *buf, size_t len) { int32_t ret; int transfered; if (devHandle == NULL) { return -1; } read_completed = 0; ret = libusb_bulk_transfer(devHandle, CONTROL_READ_ENDPOINT, buf, len, &transfered, timeout); if (ret < 0) { qCritical("libusb_bulk_transfer read error %d\n", ret); return -1; } return transfered; } /* Helper function for libusb_bulk_transfer, display error message with the caller name */ int32_t ch341::Write(uint8_t *buf, size_t len) { int32_t ret; int transfered; if (devHandle == NULL) { return -1; } write_completed = 0; ret = libusb_bulk_transfer(devHandle, CONTROL_WRITE_ENDPOINT, buf, len, &transfered, timeout); if (ret < 0) { qCritical("libusb_bulk_transfer write error %d\n", ret); return -1; } return transfered; } #endif /** * @breif timeouts in milliseconds */ int32_t ch341::SetTimeouts(int16_t t) { if (t >= 50 && t <= 2000) { timeout = t; return 0; } return -1; } void ch341::SetParity(uint8_t p) { parity = p; } void ch341::SetBits(uint8_t b) { bits = b; } void ch341::SetStops(uint8_t s) { stops = s; } // TODO void ch341::SetFlowControl(uint8_t f) { flow_control = f; // check state uint8_t r[LIBUSB_CONTROL_SETUP_SIZE]; int ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_READ_REG, CH341_REG_STAT, 0, &r[0], 0, timeout); // to check buffer 0x9f, 0xee // TODO check this switch (flow_control) { case 0: // NONE libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, CH34X_FLOW_CONTROL_NONE, NULL, 0, timeout); break; case 1: // RTS_CTS libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, CH34X_FLOW_CONTROL_RTS_CTS, NULL, 0, timeout); break; case 2: // DSR_DTR libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, CH34X_FLOW_CONTROL_DSR_DTR, NULL, 0, timeout); break; } } void ch341::SetVerbose() { verbose = true; } /** * ch341a modem connections: * * rs232 -> ch341 description * 1 -> 18 data carrier detect * 2 -> 6 Rx * 3 -> 5 Tx * 4 -> 20 Data Terminal Ready * 5 Signal Ground * 6 -> 16 Data Set Ready * 7 -> 21 Request To Send * 8 -> 15 Clear To Send * 9 -> 17 Ring Indicator */ /** * @brief configure DTR, RTS for device * */ int32_t ch341::setHandshakeByte(void) { // uint8_t r[CH341_INPUT_BUF_SIZE]; // int ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_MODEM_CTRL, NULL, 0, &r[0], CH341_INPUT_BUF_SIZE, timeout); // if (ret < 0) // { // qCritical("Faild to get handshake byte %d\n", ret); // return -1; // } quint8 control = 0;//r[0]; if (dtr) { control |= CH341_CONTROL_DTR; } if (rts) { control |= CH341_CONTROL_RTS; } #if DEBUG_CH341 qDebug() << "set dtr " << ((control & CH341_CONTROL_DTR) ? 1 : 0) << "rts" << ((control & CH341_CONTROL_RTS) ? 1 : 0); #endif if (libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_MODEM_CTRL, ~control, 0, NULL, 0, timeout) < 0) { qCritical("Faild to set handshake byte"); return -1; } return 0; } int32_t ch341::getModemState(void) { uint8_t r[2]; int ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_READ_REG, CH341_REG_STAT, 0, &r[0], 2, timeout); if (ret < 0) { qCritical("Faild to get handshake byte %d", ret); return -1; } uint8_t st = ~r[0]; // invert #if DEBUG_CH341 qDebug() << "get cts" << ((st & CH341_UART_CTS) ? 1 : 0) << "dsr" << ((st & CH341_UART_DSR) ? 1 : 0); #endif return (int32_t)(st & CH341_BITS_MODEM_STAT); } #if 0 int ch341::setAsync(uint8_t data) { int ret = 0; uint8_t *buf = (uint8_t *)malloc(LIBUSB_CONTROL_SETUP_SIZE + 1); if (!buf) { return -2; } transfer = libusb_alloc_transfer(0); if (!transfer) { free(buf); return -2; } // qCritical("async set mode %02x\n", data); libusb_fill_control_setup(buf, CTRL_IN, CH341_REQ_READ_REG, CH341_REG_STAT, 0, 1); buf[LIBUSB_CONTROL_SETUP_SIZE] = data; libusb_fill_control_transfer(transfer, devHandle, buf, cb_ctrl_changed, NULL, timeout); transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK | LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; ret = libusb_submit_transfer(transfer); return ret; } void ch341::updateStatus() { uint8_t stat[CH341_INPUT_BUF_SIZE]; uint8_t status; uint8_t delta; int ret; //libusb_control_transfer(devHandle, CONTROL_REQUEST_TYPE_IN, CH341_REQ_READ_REG, CH341_REG_STAT, 0, &stat[0], CH341_INPUT_BUF_SIZE, timeout); ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_MODEM_CTRL, NULL, 0, &stat[0], CH341_INPUT_BUF_SIZE, timeout); if (ret < 0) { qCritical("Faild to update status %d\n", ret); return; } status = ~stat[2] & CH341_BITS_MODEM_STAT; delta = msr ^ status; msr = status; if (delta & CH341_UART_CTS) { ctsState != ctsState; } if (delta & CH341_UART_DSR) { dsrState != dsrState; } if (delta & CH341_UART_RING) { ringState != ringState; } if (delta & CH341_UART_DCD) { dcdState != dcdState; } } #endif int32_t ch341::SetDTR(int32_t state) { #if DEBUG_CH341 qDebug() << "ch341::SetDTR(" << state << ") "; #endif if (state) { dtr = 1; } else { dtr = 0; } int32_t r = setHandshakeByte(); return r; } int32_t ch341::SetRTS(int32_t state) { #if DEBUG_CH341 qDebug() << "ch341::SetRTS(" << state << ") "; #endif if (state) { rts = 1; } else { rts = 0; } int32_t r = setHandshakeByte(); return r; } int32_t ch341::GetDSR() { int32_t r = getModemState(); #if DEBUG_CH341 qDebug() << "ch341::GetDSR(" << ((r & CH341_UART_DSR) ? 1 : 0) << ") "; #endif return (r & CH341_UART_DSR) ? 1 : 0; } int32_t ch341::GetCTS() { int32_t r = getModemState(); #if DEBUG_CH341 qDebug() << "ch341::GetCTS(" << ((r & CH341_UART_CTS) ? 1 : 0) << ") "; #endif return (r & CH341_UART_CTS) ? 1 : 0; } int32_t ch341::SetRTSDTR(int st) { quint8 control = 0; if (st) { dtr = 1; rts = 1; } else { dtr = 0; rts = 0; } #if 0 if (dtr) { control |= CH341_CONTROL_DTR; } if (rts) { control |= CH341_CONTROL_RTS; } qDebug() << "ch341::SetRTSDTR(" << st << ") "; if (dev_vers < 0x20) { // TODO for old chips is not tested! if (libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, 0x0606, ~control, NULL, 0, timeout) < 0) { qCritical("Faild to set handshake byte\n"); return -1; } } else { if (libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_MODEM_CTRL, ~control, 0, NULL, 0, timeout) < 0) { qCritical("Faild to set handshake byte\n"); return -1; } } #endif int32_t r = setHandshakeByte(); return r; } // TODO to check this int32_t ch341::SetConfigLCR() { // TODO in case of same bits for all UART devices, to move this lcr into SerialInterface // now set LCR uint8_t lcr = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX; // TODO check this switch (parity) { case 'N': // no change in lcr break; case 'O': lcr |= CH341_LCR_ENABLE_PAR; break; case 'S': lcr |= (CH341_LCR_ENABLE_PAR | CH341_LCR_MARK_SPACE | CH341_LCR_PAR_EVEN); break; case 'E': lcr |= (CH341_LCR_ENABLE_PAR | CH341_LCR_PAR_EVEN); break; case 'M': lcr |= (CH341_LCR_ENABLE_PAR | CH341_LCR_MARK_SPACE); break; default: break; } if (stops == 2) { lcr |= CH341_LCR_STOP_BITS_2; } if (bits <= 5) { lcr |= CH341_LCR_CS5; } else if (bits == 6) { lcr |= CH341_LCR_CS6; } else if (bits == 7) { lcr |= CH341_LCR_CS7; } else { lcr |= CH341_LCR_CS8; } #if DEBUG_CH341 qDebug() << "ch341::SetConfigLCR(" << lcr << ") "; #endif int32_t ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_LCR, lcr, NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_LCR\n"); } ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, 0, NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL\n"); } return ret; } int32_t ch341::SetBreakControl(int32_t state) { #if DEBUG_CH341 qDebug() << "ch341::SetBreakControl(" << state << ") "; #endif uint16_t reg_contents; uint8_t break_reg[2] = {0, 0}; int32_t ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_READ_REG, CH341_REG_BREAK, 0, (uint8_t *)®_contents, 2, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_READ_REG, CH341_REG_BREAK\n"); return ret; } if (state) { break_reg[0] &= ~CH341_NBREAK_BITS_REG1; break_reg[1] &= ~CH341_NBREAK_BITS_REG2; } else { break_reg[0] |= CH341_NBREAK_BITS_REG1; break_reg[1] |= CH341_NBREAK_BITS_REG2; } // TODO is it right??? //reg_contents = ReverseWord((uint16_t)(break_reg[0] << 8) + break_reg[1]); reg_contents = ((uint16_t)(break_reg[0] << 8) + break_reg[1]); ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_BREAK, reg_contents, NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_BREAK\n"); return ret; } return 0; } /** * @brief functions sets the baudrate 'speed' * see BSD Kernel: uchcom.c Source File * supports common baud rates: * 50, 75, 100, 110, 134.5, 150, 300, 600, 900, 1200, 1800, 2400, 3600, 4800, 9600, 14400, 19200, * 33600, 38400, 56000, 57600, 76800, 115200, 128000, 153600, 230400, 460800, 921600, * 1500000, 2000000 etc. */ int32_t ch341::SetBaudRate(int32_t speed) { int32_t ret; int dv_prescale; int dv_div; int dv_mod; static QVector speed_divider = {{307200, 307200, 0, {7, 0xD9, 0}}, {921600, 921600, 0, {7, 0xF3, 0}}, {2999999, 23530, 6000000, {3, 0, 0}}, {23529, 2942, 750000, {2, 0, 0}}, {2941, 368, 93750, {1, 0, 0}}, {367, 1, 11719, {0, 0, 0}} }; if (!speed) { return -1; } foreach (uart_div d, speed_divider) { if (d.dvr_high >= speed && d.dvr_low <= speed) { dv_prescale = d.dvr_divider.dv_prescaler; if (d.dvr_base_clock == 0) { dv_div = d.dvr_divider.dv_div; } else { uint32_t div = d.dvr_base_clock / speed; uint32_t rem = d.dvr_base_clock % speed; if (div == 0 || div >= 0xFF) { return -1; } if ((rem << 1) >= speed) { div += 1; } dv_div = (uint8_t) - div; } uint32_t mod = (CH341_BPS_MOD_BASE / speed) + CH341_BPS_MOD_BASE_OFS; mod = mod + (mod / 2); dv_mod = (mod + 0xFF) / 0x100; // calculated, now send to device qDebug() << "set baudrate" << speed << (hex) << (dv_div << 8) + (dv_prescale) << (uint16_t)(dv_mod) << (dec) ; ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_BAUD1, (dv_div << 8) + (dv_prescale), NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_BAUD1\n"); return ret; } ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_BAUD2, (uint16_t)(dv_mod), NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_BAUD2\n"); return ret; } ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, 0, NULL, 0, timeout); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL\n"); } return ret; } } // not found return -1; } /** * @brief reset chip settings? */ int32_t ch341::ResetChip() { return libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_SERIAL_INIT, CH341_RESET_VALUE, CH341_RESET_INDEX, NULL, 0, timeout); } int32_t ch341::ClearChip() { // return libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_SERIAL_INIT, 0, 0, NULL, 0, timeout); return libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_SERIAL_INIT, 0xc29c, 0xb2b9, NULL, 0, timeout); } /** * Open CH341A, find the device and set the default interface. */ int32_t ch341::Open(uint16_t vid, uint16_t pid) { struct libusb_device *dev; int32_t ret; struct sigaction sa; qDebug() << "ch341::Open(" << vid << pid << ") "; uint8_t desc[0x12]; if (devHandle != NULL) { qCritical() << "Call ch341Release before re-configure"; return -1; } qDebug() << "ch341::Configure()"; ret = libusb_init(NULL); if (ret < 0) { qCritical() << "Couldn't initialise libusb"; return -1; } #if LIBUSB_API_VERSION < 0x01000106 libusb_set_debug(NULL, 3); #else libusb_set_option(NULL, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_INFO); #endif if (!(devHandle = libusb_open_device_with_vid_pid(NULL, vid, pid))) { qCritical("Couldn't open device [%04x:%04x].", vid, pid); return -1; } else { qDebug("Open device [%04x:%04x].", vid, pid); } if (!(dev = libusb_get_device(devHandle))) { qCritical() << "Couldn't get bus number and address."; CloseHandle(); return -1; } #ifndef Q_OS_WIN32 if (libusb_kernel_driver_active(devHandle, 0)) { ret = libusb_detach_kernel_driver(devHandle, 0); if (ret) { qCritical("Failed to detach kernel driver: '%s'", strerror(-ret)); CloseHandle(); return -1; } else { qDebug() << "Detach kernel driver"; } } #endif ret = libusb_claim_interface(devHandle, 0); if (ret) { qCritical("Failed to claim interface 0: '%s'", strerror(-ret)); CloseHandle(); return -1; } else { qDebug() << "Claim interface 0"; } ret = libusb_get_descriptor(devHandle, LIBUSB_DT_DEVICE, 0x00, desc, 0x12); if (ret < 0) { qCritical("Failed to get device descriptor: '%s'", strerror(-ret)); ReleaseInterface(); return -1; } qDebug("Device reported its revision [%d.%02d]", desc[12], desc[13]); sa.sa_handler = &sig_int; sa.sa_flags = SA_RESTART; sigfillset(&sa.sa_mask); if (sigaction(SIGINT, &sa, &saold) == -1) { perror("Error: cannot handle SIGINT"); // Should not happen } ret = init(); if (ret < 0) { qCritical("Failed to init device %d", strerror(-ret)); ReleaseInterface(); return -1; } return 0; } int32_t ch341::init(void) { int32_t ret; uint8_t buf[2]; /* expect two bytes 0x27 0x00 */ ret = libusb_control_transfer(devHandle, CTRL_IN, CH341_REQ_READ_VERSION, 0, 0, buf, 2, timeout); if (ret < 0) { qCritical("can not read version\n"); return ret; } #if DEBUG_CH341 qDebug("Chip version: 0x%02x\n", buf[0]); #endif dev_vers = buf[0]; // send init to controller (reset) ret = ClearChip(); if (ret < 0) { qCritical("failed control transfer 0xa1\n"); return ret; } dtr = 1; ret = setHandshakeByte(); if (ret < 0) { qCritical("failed set dtr\n"); return ret; } rts = 1; ret = setHandshakeByte(); if (ret < 0) { qCritical("failed set rts \n"); return ret; } // check state not implemented ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, 0x0000, NULL, 0, 1000); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL\n"); return ret; } ret = SetBaudRate(baudRate); if (ret < 0) { return ret; } ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_LCR, 0x00c3, NULL, 0, 1000); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_LCR\n"); return ret; } // check state not implemented ret = libusb_control_transfer(devHandle, CTRL_OUT, CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL, 0x0000, NULL, 0, 1000); if (ret < 0) { qCritical("failed control transfer CH341_REQ_WRITE_REG, CH341_REG_FLOW_CTRL\n"); return ret; } return ret; } void ch341::ReleaseInterface(void) { if (devHandle) { libusb_release_interface(devHandle, 0); CloseHandle(); } } void ch341::CloseHandle(void) { if (devHandle) { libusb_close(devHandle); devHandle = NULL; } } // void ch341::updateStatus(uint8_t *data, size_t l) // { // } /** * release libusb structure and ready to exit */ int32_t ch341::Release(void) { if (devHandle == NULL) { return -1; } qDebug() << "ch341::Release()"; libusb_release_interface(devHandle, 0); libusb_close(devHandle); libusb_exit(NULL); devHandle = NULL; sigaction(SIGINT, &saold, NULL); return 0; } #if 0 /** * Helper function for libusb_bulk_transfer, display error message with the caller name */ int32_t ch341::usbTransfer(const char *func, uint8_t type, uint8_t *buf, int len) { int32_t ret; int transfered; if (devHandle == NULL) { return -1; } qDebug() << "ch341::usbTransfer()"; ret = libusb_bulk_transfer(devHandle, type, buf, len, &transfered, timeout); if (ret < 0) { qCritical("%s: Failed to %s %d bytes '%s'", func, (type == BULK_WRITE_ENDPOINT) ? "write" : "read", len, strerror(-ret)); return -1; } return transfered; } // -------------------------------------------------------------------------- // ch341writeEEPROM() // write n bytes to 24c32/24c64 device (in packets of 32 bytes) int32_t ch341::writeEEPROM(uint8_t *buffer, uint32_t bytesum) { uint8_t ch341outBuffer[EEPROM_WRITE_BUF_SZ], *outptr, *bufptr; int32_t ret = 0, i; uint16_t byteoffset = 0, bytes = bytesum; uint8_t addrbytecount = 3; // 24c32 and 24c64 (and other 24c??) use 3 bytes for addressing int32_t actuallen = 0; bufptr = buffer; while (bytes) { outptr = ch341outBuffer; *outptr++ = CH341_CMD_I2C_STREAM; *outptr++ = CH341_CMD_I2C_STM_STA; *outptr++ = CH341_CMD_I2C_STM_OUT + addrbytecount + MIN(bytes, 25); *outptr++ = 0xa0; // EEPROM device address *outptr++ = (uint8_t)(byteoffset >> 8 & 0xff); // MSB (big-endian) byte address *outptr++ = (uint8_t)(byteoffset & 0xff); // LSB of 16-bit byte address memcpy(outptr, bufptr, MIN(bytes, 25)); // payload has two parts: 25 bytes & up to 7 more bytes outptr += MIN(bytes, 25); bufptr += MIN(bytes, 25); bytes -= MIN(bytes, 25); *outptr++ = CH341_CMD_I2C_STM_END; if (bytes) { *outptr++ = CH341_CMD_I2C_STREAM; *outptr++ = CH341_CMD_I2C_STM_OUT + MIN(bytes, 7); memcpy(outptr, bufptr, MIN(bytes, 7)); outptr += MIN(bytes, 7); bufptr += MIN(bytes, 7); bytes -= MIN(bytes, 7); } *outptr++ = CH341_CMD_I2C_STM_STO; *outptr = CH341_CMD_I2C_STM_END; byteoffset += 0x20; for (i = 0; i < EEPROM_WRITE_BUF_SZ; i++) { if (!(i % 0x10)) { qDebug("\n%04x : ", i); } qDebug("%02x ", ch341outBuffer[i]); } qDebug("\n"); ret = libusb_bulk_transfer(devHandle, BULK_WRITE_ENDPOINT, ch341outBuffer, EEPROM_WRITE_BUF_SZ, &actuallen, timeout); if (ret < 0) { qCritical("Failed to write to EEPROM: '%s'\n", strerror(-ret)); return -1; } qDebug("Writing [aa 5a 00] to EEPROM\n"); // Magic CH341a packet! Undocumented, unknown purpose outptr = ch341outBuffer; *outptr++ = CH341_CMD_I2C_STREAM; *outptr++ = 0x5a; // what is this 0x5a?? *outptr++ = CH341_CMD_I2C_STM_END; ret = libusb_bulk_transfer(devHandle, BULK_WRITE_ENDPOINT, ch341outBuffer, 3, &actuallen, timeout); if (ret < 0) { qCritical("Failed to write to EEPROM: '%s'\n", strerror(-ret)); return -1; } qDebug("Written [%d] of [%d] bytes \r", bytes, bytesum); } return 0; } // -------------------------------------------------------------------------- // ch341readEEPROM() // read n bytes from device (in packets of 32 bytes) int32_t ch341::readEEPROM(uint8_t *buffer, uint32_t bytestoread) { uint8_t ch341outBuffer[EEPROM_READ_BULKOUT_BUF_SZ]; uint8_t ch341inBuffer[IN_BUF_SZ]; // 0x100 bytes int32_t ret = 0, readpktcount = 0; struct libusb_transfer *xferBulkIn, *xferBulkOut; struct timeval tv = {0, 100}; // our async polling interval xferBulkIn = libusb_alloc_transfer(0); xferBulkOut = libusb_alloc_transfer(0); bulkin_count = 0; if (!xferBulkIn || !xferBulkOut) { qCritical("Couldnt allocate USB transfer structures\n"); return -1; } qDebug("Allocated USB transfer structures\n"); memset(ch341inBuffer, 0, EEPROM_READ_BULKIN_BUF_SZ); memcpy(ch341outBuffer, CH341_EEPROM_READ_SETUP_CMD, EEPROM_READ_BULKOUT_BUF_SZ); libusb_fill_bulk_transfer(xferBulkIn, devHandle, BULK_READ_ENDPOINT, ch341inBuffer, EEPROM_READ_BULKIN_BUF_SZ, cbBulkIn, NULL, timeout); libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT, ch341outBuffer, EEPROM_READ_BULKOUT_BUF_SZ, cbBulkOut, NULL, timeout); qDebug("Filled USB transfer structures\n"); libusb_submit_transfer(xferBulkIn); qDebug("Submitted BULK IN start packet\n"); libusb_submit_transfer(xferBulkOut); qDebug("Submitted BULK OUT setup packet\n"); // readbuf = buffer; byteoffset = 0; while (1) { qDebug("Read [%d] of [%d] bytes \r", byteoffset, bytestoread); ret = libusb_handle_events_timeout(NULL, &tv); if (ret < 0 || bulkin_count == -1) // indicates an error { qCritical("ret from libusb_handle_timeout = %d\n", ret); qCritical("bulkin_count = %d\n", bulkin_count); if (ret < 0) { qCritical("USB read error : %s\n", strerror(-ret)); } libusb_free_transfer(xferBulkIn); libusb_free_transfer(xferBulkOut); return -1; } if (bulkin_count) // callback function reports a new BULK IN packet received { bulkin_count = 0; // reset the flag readpktcount++; // increment the read packet counter byteoffset += EEPROM_READ_BULKIN_BUF_SZ; if (byteoffset == bytestoread) { break; } qDebug("\nRe-submitting transfer request to BULK IN endpoint\n"); libusb_submit_transfer(xferBulkIn); // re-submit request for next BULK IN packet of EEPROM data if (syncackpkt) { syncackpkt = 0; } // if 4th packet received, we are at end of 0x80 byte data block, // if it is not the last block, then resubmit request for data if (readpktcount == 4) { qDebug("\nSubmitting next transfer request to BULK OUT endpoint\n"); readpktcount = 0; memcpy(ch341outBuffer, CH341_EEPROM_READ_NEXT_CMD, CH341_EEPROM_READ_CMD_SZ); ch341outBuffer[4] = (uint8_t)(byteoffset >> 8 & 0xff); // MSB (big-endian) byte address ch341outBuffer[5] = (uint8_t)(byteoffset & 0xff); // LSB of 16-bit byte address libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT, ch341outBuffer, EEPROM_READ_BULKOUT_BUF_SZ, cbBulkOut, NULL, timeout); libusb_submit_transfer(xferBulkOut);// update transfer struct (with new EEPROM page offset) // and re-submit next transfer request to BULK OUT endpoint } } } // out_deinit: libusb_free_transfer(xferBulkIn); libusb_free_transfer(xferBulkOut); return 0; } /** * set the i2c bus speed speed(b1b0): * 0 = 20kHz CH341_STM_I2C_20K * 1 = 100kHz CH341_STM_I2C_100K * 2 = 400kHz CH341_STM_I2C_400K * 3 = 750kHz CH341_STM_I2C_750K * set the spi bus data width speed(b2): * 0 = Single * 1 = Double CH341_STM_SPI_DBL */ int32_t ch341::SetStream(uint32_t speed) { uint8_t buf[3]; if (devHandle == NULL) { return -1; } qDebug() << "ch341::SetStream()"; buf[0] = CH341_CMD_I2C_STREAM; buf[1] = CH341_CMD_I2C_STM_SET | (speed & 0x7); buf[2] = CH341_CMD_I2C_STM_END; return usbTransfer(__func__, BULK_WRITE_ENDPOINT, buf, 3); } /** * assert or deassert the chip-select pin of the spi device */ void ch341::SpiChipSelect(uint8_t *ptr, bool selected) { qDebug() << "ch341::SpiChipSelect()"; *ptr++ = CH341_CMD_UIO_STREAM; *ptr++ = CH341_CMD_UIO_STM_OUT | (selected ? 0x36 : 0x37); if (selected) { *ptr++ = CH341_CMD_UIO_STM_DIR | 0x3F; // pin direction } *ptr++ = CH341_CMD_UIO_STM_END; } /** * transfer len bytes of data to the spi device */ int32_t ch341::SpiStream(uint8_t *out, uint8_t *in, uint32_t len) { uint8_t *inBuf, *outBuf, *inPtr, *outPtr; int32_t ret, packetLen; bool done; bool err = false; if (devHandle == NULL) { return -1; } qDebug() << "ch341::SpiStream()"; outBuf = new uint8_t[CH341_PACKET_LENGTH]; SpiChipSelect(outBuf, true); ret = usbTransfer(__func__, BULK_WRITE_ENDPOINT, outBuf, 4); if (ret < 0) { delete outBuf; return -1; } inBuf = new uint8_t[CH341_PACKET_LENGTH]; inPtr = in; do { done = true; packetLen = len + 1; // STREAM COMMAND + data length if (packetLen > CH341_PACKET_LENGTH) { packetLen = CH341_PACKET_LENGTH; done = false; } outPtr = outBuf; *outPtr++ = CH341_CMD_SPI_STREAM; for (int i = 0; i < packetLen - 1; ++i) { *outPtr++ = ReverseByte(*out++); } ret = usbTransfer(__func__, BULK_WRITE_ENDPOINT, outBuf, packetLen); if (ret < 0) { err = true; break; } ret = usbTransfer(__func__, BULK_READ_ENDPOINT, inBuf, packetLen - 1); if (ret < 0) { err = true; break; } len -= ret; for (int i = 0; i < ret; ++i) // swap the buffer { *inPtr++ = ReverseByte(inBuf[i]); } } while (!done); if (!err) { SpiChipSelect(outBuf, false); ret = usbTransfer(__func__, BULK_WRITE_ENDPOINT, outBuf, 3); } else { ret = -1; } delete outBuf; delete inBuf; if (ret < 0) { return -1; } return 0; } #define JEDEC_ID_LEN 0x52 // additional byte due to SPI shift /** * read the JEDEC ID of the SPI Flash */ int32_t ch341::SpiCapacity(void) { uint8_t *outBuf; uint8_t *inBuf, *ptr, cap; int32_t ret; if (devHandle == NULL) { return -1; } qDebug() << "ch341::SpiCapacity()"; outBuf = new uint8_t[JEDEC_ID_LEN]; ptr = outBuf; *ptr++ = 0x9F; // Read JEDEC ID for (int i = 0; i < JEDEC_ID_LEN - 1; ++i) { *ptr++ = 0x00; } inBuf = new uint8_t[JEDEC_ID_LEN]; ret = SpiStream(outBuf, inBuf, JEDEC_ID_LEN); if (ret < 0) { delete inBuf; delete outBuf; return ret; } if (!(inBuf[1] == 0xFF && inBuf[2] == 0xFF && inBuf[3] == 0xFF)) { qDebug("Manufacturer ID: %02x", inBuf[1]); qDebug("Memory Type: %02x%02x", inBuf[2], inBuf[3]); if (inBuf[0x11] == 'Q' && inBuf[0x12] == 'R' && inBuf[0x13] == 'Y') { cap = inBuf[0x28]; qDebug("Reading device capacity from CFI structure"); } else { cap = inBuf[3]; qDebug("No CFI structure found, trying to get capacity from device ID. Set manually if detection fails."); } qDebug("Capacity: %02x", cap); } else { qDebug("Chip not found or missed in ch341a. Check connection"); delete inBuf; delete outBuf; exit(0); } delete inBuf; delete outBuf; return cap; } /** * read status register */ int32_t ch341::ReadStatus(void) { uint8_t out[2]; uint8_t in[2]; int32_t ret; if (devHandle == NULL) { return -1; } qDebug() << "ch341::ReadStatus()"; out[0] = 0x05; // Read status ret = SpiStream(out, in, 2); if (ret < 0) { return ret; } return (in[1]); } /** * write status register */ int32_t ch341::WriteStatus(uint8_t status) { uint8_t out[2]; uint8_t in[2]; int32_t ret; if (devHandle == NULL) { return -1; } qDebug() << "ch341::WriteStatus()"; out[0] = 0x06; // Write enable ret = SpiStream(out, in, 1); if (ret < 0) { return ret; } out[0] = 0x01; // Write status out[1] = status; ret = SpiStream(out, in, 2); if (ret < 0) { return ret; } out[0] = 0x04; // Write disable ret = SpiStream(out, in, 1); if (ret < 0) { return ret; } return 0; } /** * chip erase */ int32_t ch341::EraseChip(void) { uint8_t out[1]; uint8_t in[1]; int32_t ret; if (devHandle == NULL) { return -1; } qDebug() << "ch341::EraseChip()"; out[0] = 0x06; // Write enable ret = SpiStream(out, in, 1); if (ret < 0) { return ret; } out[0] = 0xC7; // Chip erase ret = SpiStream(out, in, 1); if (ret < 0) { return ret; } out[0] = 0x04; // Write disable ret = SpiStream(out, in, 1); if (ret < 0) { return ret; } return 0; } /** * read the content of SPI device to buf, make sure the buf is big enough before call */ int32_t ch341::SpiRead(uint8_t *buf, uint32_t add, uint32_t len) { uint8_t *outBuf; uint8_t *inBuf; if (devHandle == NULL) { return -1; } qDebug() << "ch341::SpiRead()"; /* what subtracted is: 1. first cs package, 2. leading command for every other packages, * 3. second package contains read flash command and 3 bytes address */ const uint32_t max_payload = CH341_MAX_PACKET_LEN - CH341_PACKET_LENGTH - CH341_MAX_PACKETS + 1 - 4; uint32_t tmp, pkg_len, pkg_count; struct libusb_transfer *xferBulkIn, *xferBulkOut; uint32_t idx = 0; int32_t ret; int32_t old_counter; struct timeval tv = {0, 100}; v_print(0, len); // verbose outBuf = new uint8_t[CH341_MAX_PACKET_LEN]; memset(outBuf, 0xff, CH341_MAX_PACKET_LEN); for (int i = 1; i < CH341_MAX_PACKETS; ++i) // fill CH341_CMD_SPI_STREAM for every packet { outBuf[i * CH341_PACKET_LENGTH] = CH341_CMD_SPI_STREAM; } inBuf = new uint8_t[CH341_PACKET_LENGTH]; memset(inBuf, 0x00, CH341_PACKET_LENGTH); xferBulkIn = libusb_alloc_transfer(0); xferBulkOut = libusb_alloc_transfer(0); qDebug("Read started!"); while (len > 0) { v_print(1, len); // verbose fflush(stdout); SpiChipSelect(outBuf, true); idx = CH341_PACKET_LENGTH + 1; outBuf[idx++] = 0xC0; // byte swapped command for Flash Read tmp = add; for (int i = 0; i < 3; ++i) // starting address of next read { outBuf[idx++] = ReverseByte((tmp >> 16) & 0xFF); tmp <<= 8; } if (len > max_payload) { pkg_len = CH341_MAX_PACKET_LEN; pkg_count = CH341_MAX_PACKETS - 1; len -= max_payload; add += max_payload; } else { pkg_count = (len + 4) / (CH341_PACKET_LENGTH - 1); if ((len + 4) % (CH341_PACKET_LENGTH - 1)) { pkg_count ++; } pkg_len = (pkg_count) * CH341_PACKET_LENGTH + ((len + 4) % (CH341_PACKET_LENGTH - 1)) + 1; len = 0; } bulkin_count = 0; libusb_fill_bulk_transfer(xferBulkIn, devHandle, BULK_READ_ENDPOINT, inBuf, CH341_PACKET_LENGTH, cbBulkIn, buf, timeout); buf += max_payload; // advance user's pointer libusb_submit_transfer(xferBulkIn); libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT, outBuf, pkg_len, cbBulkOut, NULL, timeout); libusb_submit_transfer(xferBulkOut); old_counter = bulkin_count; while (bulkin_count < pkg_count) { libusb_handle_events_timeout(NULL, &tv); if (bulkin_count == -1) // encountered error { len = 0; ret = -1; break; } if (old_counter != bulkin_count) // new package came { if (bulkin_count != pkg_count) { libusb_submit_transfer(xferBulkIn); // resubmit bulk in request } old_counter = bulkin_count; } } SpiChipSelect(outBuf, false); ret = usbTransfer(__func__, BULK_WRITE_ENDPOINT, outBuf, 3); if (ret < 0) { break; } if (force_stop == 1) // user hit ctrl+C { force_stop = 0; if (len > 0) { qCritical() << "User hit Ctrl+C, reading unfinished."; } break; } } delete outBuf; delete inBuf; libusb_free_transfer(xferBulkIn); libusb_free_transfer(xferBulkOut); v_print(2, 0); return ret; } #define WRITE_PAYLOAD_LENGTH 301 // 301 is the length of a page(256)'s data with protocol overhead /** * write buffer(*buf) to SPI flash */ int32_t ch341::SpiWrite(uint8_t *buf, uint32_t add, uint32_t len) { uint8_t *outBuf; uint8_t *inBuf; uint32_t tmp, pkg_count; struct libusb_transfer *xferBulkIn, *xferBulkOut; uint32_t idx = 0; uint32_t ret; int32_t old_counter; struct timeval tv = {0, 100}; v_print(0, len); // verbose if (devHandle == NULL) { return -1; } qDebug() << "ch341::SpiWrite()"; outBuf = new uint8_t[WRITE_PAYLOAD_LENGTH]; memset(outBuf, 0xff, WRITE_PAYLOAD_LENGTH); xferBulkIn = libusb_alloc_transfer(0); xferBulkOut = libusb_alloc_transfer(0); inBuf = new uint8_t[CH341_PACKET_LENGTH]; qDebug("Write started!"); while (len > 0) { v_print(1, len); outBuf[0] = 0x06; // Write enable ret = SpiStream(outBuf, inBuf, 1); SpiChipSelect(outBuf, true); idx = CH341_PACKET_LENGTH; outBuf[idx++] = CH341_CMD_SPI_STREAM; outBuf[idx++] = 0x40; // byte swapped command for Flash Page Write tmp = add; for (int i = 0; i < 3; ++i) // starting address of next write { outBuf[idx++] = ReverseByte((tmp >> 16) & 0xFF); tmp <<= 8; } tmp = 0; pkg_count = 1; while ((idx < WRITE_PAYLOAD_LENGTH) && (len > tmp)) { if (idx % CH341_PACKET_LENGTH == 0) { outBuf[idx++] = CH341_CMD_SPI_STREAM; pkg_count ++; } else { outBuf[idx++] = ReverseByte(*buf++); tmp++; if (((add + tmp) & 0xFF) == 0) // cross page boundary { break; } } } len -= tmp; add += tmp; bulkin_count = 0; libusb_fill_bulk_transfer(xferBulkIn, devHandle, BULK_READ_ENDPOINT, inBuf, CH341_PACKET_LENGTH, cbBulkIn, NULL, timeout); libusb_submit_transfer(xferBulkIn); libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT, outBuf, idx, cbBulkOut, NULL, timeout); libusb_submit_transfer(xferBulkOut); old_counter = bulkin_count; ret = 0; while (bulkin_count < pkg_count) { libusb_handle_events_timeout(NULL, &tv); if (bulkin_count == -1) // encountered error { ret = -1; break; } if (old_counter != bulkin_count) // new package came { if (bulkin_count != pkg_count) { libusb_submit_transfer(xferBulkIn); // resubmit bulk in request } old_counter = bulkin_count; } } if (ret < 0) { break; } SpiChipSelect(outBuf, false); ret = usbTransfer(__func__, BULK_WRITE_ENDPOINT, outBuf, 3); if (ret < 0) { break; } outBuf[0] = 0x04; // Write disable ret = SpiStream(outBuf, inBuf, 1); do { ret = ReadStatus(); if (ret != 0) { libusb_handle_events_timeout(NULL, &tv); } } while (ret != 0); if (force_stop == 1) // user hit ctrl+C { force_stop = 0; if (len > 0) { qCritical() << "User hit Ctrl+C, writing unfinished."; } break; } } libusb_free_transfer(xferBulkIn); libusb_free_transfer(xferBulkOut); delete outBuf; delete inBuf; v_print(2, 0); return ret; } #endif tmp9balx013/SrcPony/motsfbuf.cpp0000644000175000017500000003242113616566001016656 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include // #include #define MAXLINE 520 #define START_RECORD '0' //starting record (optional) #define DATA_RECORD16 '1' //16 bit address data record #define DATA_RECORD24 '2' //24 bit address data record #define DATA_RECORD32 '3' //32 bit address data record #define SYMBOL_RECORD '4' //symbol record (LSI extension) #define NBLOCK_RECORD '5' //number of data records in preceeding block #define UNUSED_RECORD '6' //unused #define END_RECORD32 '7' //ending record for S3 records #define END_RECORD24 '8' //ending record for S2 records #define END_RECORD16 '9' //ending record for S1 records #include "types.h" #include "motsfbuf.h" // Header file #include "errcode.h" #include "crc.h" MotorolaSFileBuf::MotorolaSFileBuf(e2AppWinInfo *wininfo) : FileBuf(wininfo), highestPC(NULL), highestAddr(0), lowestAddr(0x7fffffff), valid_record_count(0) { file_type = MOTOS; } int MotorolaSFileBuf::WriteRecord(QTextStream &outs, uint8_t *bptr, long curaddr, long recsize, int fmt) { int rval = 1; int len = 0; int j; int discard; //check for empty data record (all FF's) if (fmt == DATA_RECORD16 || fmt == DATA_RECORD24 || fmt == DATA_RECORD32) { discard = 1; for (j = 0; j < recsize; j++) { if (bptr[curaddr + j] != 0xFF) { discard = 0; break; } } } else { discard = 0; } if (discard) { return rval; } switch (fmt) { case START_RECORD: //starting record (optional) len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; case DATA_RECORD16: //16 bit address data record len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; case DATA_RECORD24: //24 bit address data record len = recsize + 3 + 1; //3 byte address + 1 byte checksum break; case DATA_RECORD32: //32 bit address data record len = recsize + 4 + 1; //4 byte address + 1 byte checksum break; case SYMBOL_RECORD: //symbol record (LSI extension) len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; case NBLOCK_RECORD: //number of data records in preceeding block len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; case UNUSED_RECORD: //unused len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; case END_RECORD32: //ending record for S3 records len = recsize + 4 + 1; //4 byte address + 1 byte checksum break; case END_RECORD24: //ending record for S2 records len = recsize + 3 + 1; //3 byte address + 1 byte checksum break; case END_RECORD16: //ending record for S1 records len = recsize + 2 + 1; //2 byte address + 1 byte checksum break; default: rval = 0; break; } if (rval) { int checksum = 0; //type field outs << QString().sprintf("S%c", fmt); //len field outs << QString().sprintf("%02X", len & 0xFF); checksum += len & 0xFF; //addr field if (fmt == DATA_RECORD24 || fmt == END_RECORD24) { outs << QString().sprintf("%06lX", curaddr & 0xFFFFFF); checksum += (curaddr >> 16) & 0xFF; checksum += (curaddr >> 8) & 0xFF; checksum += curaddr & 0xFF; } else if (fmt == DATA_RECORD32 || fmt == END_RECORD32) { outs << QString().sprintf("%08lX", curaddr); checksum += (curaddr >> 24) & 0xFF; checksum += (curaddr >> 16) & 0xFF; checksum += (curaddr >> 8) & 0xFF; checksum += curaddr & 0xFF; } else //all other have a 16 bit address field { outs << QString().sprintf("%04lX", curaddr & 0xFFFF); checksum += (curaddr >> 8) & 0xFF; checksum += curaddr & 0xFF; } for (j = 0; j < recsize; j++) { outs << QString().sprintf("%02X", bptr[curaddr + j]); checksum += bptr[curaddr + j]; } outs << QString().sprintf("%02X\n", ~checksum & 0xFF); } return rval; } #define min(a,b) ( (a < b) ? a : b ) int MotorolaSFileBuf::Save(int savetype, long relocation_offset) { QFile fh(FileBuf::GetFileName()); int rval = OK; (void)relocation_offset; //unused if (!fh.open(QIODevice::WriteOnly)) { return CREATEERROR; } QTextStream out(&fh); long dsize = FileBuf::GetBlockSize() * FileBuf::GetNoOfBlock(); long size = FileBuf::GetBufSize(); uint8_t *ptr = FileBuf::GetBufPtr(); //Remove FF's tail while (ptr[size - 1] == 0xFF) { size--; } if (savetype == PROG_TYPE) { if (GetSplitted() > 0 && GetSplitted() <= dsize) { size = GetSplitted(); } else { fh.close(); return 0; } } else if (savetype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < dsize) { ptr += GetSplitted(); size = dsize - GetSplitted(); } else { fh.close(); return 0; } } if (size > 0) { char rectype; long curaddr = 0; WriteRecord(out, ptr, 0, 0, START_RECORD); while (curaddr < size) { int recsize = min((size - curaddr), 16); rectype = DATA_RECORD16; if (size > 0xffff) { rectype = DATA_RECORD24; } if (size > 0xffffff) { rectype = DATA_RECORD32; } if (!WriteRecord(out, ptr, curaddr, recsize, rectype)) { rval = WRITEERROR; break; } curaddr += recsize; } rectype = END_RECORD16; if (size > 0xffff) { rectype = END_RECORD24; } if (size > 0xffffff) { rectype = END_RECORD32; } WriteRecord(out, ptr, 0, 0, rectype); rval = curaddr; } else { rval = NOTHINGTOSAVE; } fh.close(); return rval; } int MotorolaSFileBuf::Load(int loadtype, long relocation_offset) { int rval = OK; int nocopy_mode = 0; uint8_t *endp = GetBufPtr() + GetBufSize(); uint8_t *dp = GetBufPtr(); if (loadtype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < GetBufSize()) { dp += GetSplitted(); } else { return 0; } } //Relocation check if (dp + relocation_offset > endp) { return BADPARAM; } else { dp += relocation_offset; } highestPC = NULL; highestAddr = 0; lowestAddr = 0x7fffffff; QFile fh(GetFileName()); if (!fh.open(QIODevice::ReadOnly | QIODevice::Text)) { return FILENOTFOUND; } valid_record_count = 0; char riga[MAXLINE + 1]; riga[MAXLINE] = '\0'; while (!fh.atEnd()) { fh.readLine(riga, MAXLINE); if ((rval = ParseRecord(riga, dp, endp, 0, nocopy_mode)) != OK) { if (rval == BUFFEROVERFLOW) { nocopy_mode = 1; } else { break; } } } if (nocopy_mode) { if (((int)highestAddr - (int)lowestAddr) > GetBufSize()) { rval = BUFFEROVERFLOW; } else { long l_offset = lowestAddr; nocopy_mode = 0; highestPC = NULL; highestAddr = 0; lowestAddr = 0x7fffffff; fh.seek(0); // rewind(fh); riga[MAXLINE] = '\0'; while (!fh.atEnd()) { fh.readLine(riga, MAXLINE); if ((rval = ParseRecord(riga, dp, endp, l_offset, nocopy_mode)) != OK) { break; } } } } int img_size; // img_size = 1; //Srec file with only header and end record, no data, should return success img_size = valid_record_count ? 1 : 0; if (highestPC) { img_size = highestPC + 1 - dp; } fh.close(); //This format doesn't contain information about the device size, // so keep the size of the selected eeprom if (rval == OK) { SetComment(""); SetRollOver(0); //2 (that means NO) ?? // SetCRC( mcalc_crc(GetBufPtr(), img_size) ); rval = img_size; } return rval; } /* Function: ParseRecord ** Parses an S-record in the buffer and writes it into the buffer ** if it is has a valid checksum. ** ** Args: pointer to character buffer for null terminated line ** Returns: int result code: 0 = success, else failure */ int MotorolaSFileBuf::ParseRecord(char *lbufPC, uint8_t *buf_startP, uint8_t *buf_endP, long offset, int nocopy) { unsigned long addrL; uint8_t cksmB, // checksum of addr, count, & data length *bufPC = 0; // Pointer into memory array unsigned int oheadN = 0, // Number of overhead (addr + chksum) bytes tvalN; // Temp for check checksum int unknow_rec = 0; unsigned int countN; // Number of bytes represented in record if (lbufPC[0] == '\n' || lbufPC[0] == '\r') { return OK; // discard empty lines } if (lbufPC[0] != 'S') { return BADFILETYPE; } switch (lbufPC[1]) /* examine 2nd character on the line */ { case DATA_RECORD16: /* 16 bit address field */ if (sscanf(lbufPC, "S1%2X%4lX", &countN, &addrL) != 2) { return BADFILETYPE; /* Flag error in S1 record */ } oheadN = 2 + 1; /* 2 address + 1 checksum */ break; case DATA_RECORD24: /* 24 bit address field */ if (sscanf(lbufPC, "S2%2X%6lX", &countN, &addrL) != 2) { return BADFILETYPE; /* Flag error in S2 record */ } oheadN = 3 + 1; /* 3 address + 1 checksum */ break; case DATA_RECORD32: /* 32 bit address field */ if (sscanf(lbufPC, "S3%2X%8lX", &countN, &addrL) != 2) { return BADFILETYPE; /* Flag error in S3 record */ } oheadN = 4 + 1; /* 4 address + 1 checksum */ break; /* ignore all but S1,2,3 records. */ case START_RECORD: //starting record (optional) case SYMBOL_RECORD: //symbol record (LSI extension) case NBLOCK_RECORD: //number of data records in preceeding block case UNUSED_RECORD: //unused case END_RECORD32: //ending record for S3 records case END_RECORD24: //ending record for S2 records case END_RECORD16: //ending record for S1 records //check only for correct checksum if (sscanf(lbufPC + 2, "%2X", &countN) != 1) { return BADFILETYPE; /* Flag error in SX record */ } unknow_rec = 1; break; default: // bad record return BADFILETYPE; } if (unknow_rec) { cksmB = 0; countN++; /* Bump counter to read final checksum too */ for (unsigned int i = 1; i <= countN; i++) { sscanf(lbufPC + i * 2, "%2X", &tvalN); /* Scan a 2 hex digit byte */ cksmB += (uint8_t)tvalN; } if (++cksmB) { return BADFILETYPE; /* flag checksum error */ } } else { if (addrL > highestAddr) { highestAddr = addrL; } if (addrL < lowestAddr) { lowestAddr = addrL; } if ((long)addrL < offset) { return BUFFERUNDERFLOW; } addrL -= offset; if (!nocopy) { bufPC = buf_startP + addrL; // point to right spot in buffer } /* OK now see if checksum is OK, while reading data to buffer */ cksmB = 0; countN++; /* Bump counter to read final checksum too */ for (unsigned int i = 1; i <= countN; i++) { sscanf(lbufPC + i * 2, "%2X", &tvalN); /* Scan a 2 hex digit byte */ cksmB += (uint8_t)tvalN; if ((i > oheadN) && (i < countN)) /* If scanned a data byte */ { if (!nocopy) { //Check for buffer overflow if (bufPC >= buf_endP) { return BUFFEROVERFLOW; } *bufPC++ = (uint8_t) tvalN; // write it to the buffer } } } if (++cksmB) { return BADFILETYPE; /* flag checksum error */ } if (!nocopy) { if ((bufPC - 1) > highestPC) { highestPC = bufPC - 1; /* track highest address loaded */ } } } valid_record_count++; return OK; /* Successful return */ } tmp9balx013/SrcPony/version-cmake.h.in0000644000175000017500000000064413616566001017650 0ustar carstencarsten#ifndef PONYPROGVERSION_H #define PONYPROGVERSION_H #ifndef APP_VERSION #define APP_VERSION "${APP_VERSION}" #endif #ifndef APP_AUTHOR #define APP_AUTHOR "${APP_AUTHOR}" #endif #ifndef PROGRAM_DATE #define PROGRAM_DATE "${APP_BUILD_DATE}" #endif #ifndef APP_NAME #define APP_NAME "${APP_NAME}" #endif #ifndef APP_EMAIL #define APP_EMAIL "${APP_EMAIL}" #endif #define USE_QT_VERSION ${USE_QT_VERSION} #endif tmp9balx013/SrcPony/at250xx.cpp0000644000175000017500000000713313616566001016246 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at250xx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include At250xx::At250xx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { } At250xx::~At250xx() { } // determina il numero di banchi (dimensione) dell'eeprom int At250xx::Probe(int probe_size) { qDebug() << "At250xx::Probe(" << probe_size << ")"; //if (probe_size) //{ // SetNoOfBank(n_bank); //} return OK; } int At250xx::Read(int probe, int type) { qDebug() << "At250xx::Read(" << probe << ")"; if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); qDebug() << "At250xx::Read() ** Size = " << size; int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Read(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "At250xx::Read() = " << rv; return rv; } int At250xx::Write(int probe, int type) { if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Write(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int At250xx::Verify(int type) { if (GetNoOfBank() == 0) { return BADPARAM; } int size = GetNoOfBank() * GetBankSize(); unsigned char *localbuf = new unsigned char[size]; int rval = 1; if (type & PROG_TYPE) { rval = GetBus()->Read(0, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } } delete[] localbuf; return rval; } tmp9balx013/SrcPony/busio.cpp0000644000175000017500000000464313616566001016157 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "busio.h" #include "e2cmdw.h" BusIO::BusIO(BusInterface *p) : err_no(0), last_addr(0), busI(p), old_progress(0), last_programmed_addr(0) { } int BusIO::CheckAbort(int progress) { int abort = cmdWin->GetAbortFlag(); if (!abort) { if ((progress == 0 /* && old_progress != 0*/) || progress > old_progress + 4) { cmdWin->SetProgress(progress); old_progress = progress; } } return abort; } int BusIO::Error() { int old_val = err_no; err_no = 0; return old_val; } tmp9balx013/SrcPony/fusemdlg.h0000644000175000017500000000627613616566001016315 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef FUSEMDLG_H #define FUSEMDLG_H #include #include #include #include #include #include #include "bitfield.h" #include "ui_fusedlg.h" #include "e2cmdw.h" typedef struct { QVector type; // chip id's for same descriptions of chip bits QVector fuse; QVector fuseDescr; QVector lock; QVector lockDescr; } ChipBits; class fuseModalDialog : public QDialog, public cTranslator, public Ui::FuseDialog { Q_OBJECT public: fuseModalDialog(e2CmdWindow *bw, e2AppWinInfo *p, bool readonly = false, const QString &msg = ""); virtual ~fuseModalDialog(); // Destructor public slots: void getLock(int l); void getFuse(int f); private slots: void onOk(); void onRead(); void onProg(); protected: private: void displayBitFields(); void setTextWidgets(); void initWidgets(const QString &msg, bool readonly); int eepFindFuses(long type); private: static QVector eep_bits; e2CmdWindow *cmdw; e2AppWinInfo *awip; BitFieldWidget *fuseWidget; BitFieldWidget *lockWidget; unsigned int fuseBits; unsigned int lockBits; bool fuseEnabled; bool lockEnabled; int currentChip; ChipBits currentBitField; bool write; bool read; }; #endif tmp9balx013/SrcPony/nvm3060.h0000644000175000017500000000461113616566001015607 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _NVM3060_H #define _NVM3060_H #include "types.h" #include "device.h" #include "imbus.h" class Nvm3060 : public Device { public: Nvm3060(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~Nvm3060(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: IMBus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/ispinterf.cpp0000644000175000017500000002272413616566001017041 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "errcode.h" #include "globals.h" #include "wait.h" #include "ispinterf.h" #include "e2cmdw.h" #include /* data register (0x378) * bit 0: D0 (pin 2) * bit 1: D1 (pin 3) * bit 2: D2 (pin 4) * bit 3: D3 (pin 5) * bit 4: D4 (pin 6) * bit 5: D5 (pin 7) * bit 6: D6 (pin 8) * bit 7: D7 (pin 9) */ /* control register (0x37A) * bit 0: STROBE (pin 1)- * bit 1: AUTOLF (pin 14)- * bit 2: INIT (pin 16)- * bit 3: SELECTIN (pin 17)- */ /* status register (0x379) * bit 3: ERROR (pin 15) * bit 4: SELECT (pin 13) * bit 5: POUT (pin 12) * bit 6: ACK (pin 10) * bit 7: BUSY (pin 11)- */ //Real AVR ISP #define AVRISP_MAPPED #ifdef AVRISP_MAPPED //Real AVR ISP #define WB_TEST1 0 /* DATA (pin 2) */ #define WB_TEST2 1 /* DATA (pin 3) */ #define WB_ENA1 2 /* DATA (pin 4) */ #define WB_ENA2 3 /* DATA (pin 5) */ #define WB_SCK 4 /* DATA (pin 6) */ #define WB_DOUT 5 /* DATA (pin 7) */ #define WB_LED 6 /* DATA (pin 8) */ #define WB_RST 7 /* DATA (pin 9) */ #define RB_DIN 6 /* STATUS (pin 10) */ #define RB_TEST1 5 /* STATUS (pin 12) */ #define RB_TEST2 7 /* STATUS (pin 11) */ #else //Remapped AVR ISP #define WB_RST 0 /* DATA (pin 2) */ #define WB_SCK 1 /* DATA (pin 3) */ #define WB_DOUT 2 /* DATA (pin 4) */ #define WB_ENA2 6 /* DATA (pin 8) */ #define WB_TEST2 7 /* DATA (pin 9) */ #define WB_LED 0 /* CTRL (pin 1)- */ #define WB_ENA1 2 /* CTRL (pin 16)- */ #define WB_TEST1 3 /* CTRL (pin 17)- */ #define RB_DIN 6 /* STATUS (pin 10) */ #define RB_TEST2 7 /* STATUS (pin 11) */ #define RB_TEST1 5 /* STATUS (pin 12) */ #endif #define WF_TEST1 (1 << WB_TEST1) #define WF_TEST2 (1 << WB_TEST2) #define WF_ENA1 (1 << WB_ENA1) #define WF_ENA2 (1 << WB_ENA2) #define WF_SCK (1 << WB_SCK) #define WF_DOUT (1 << WB_DOUT) #define WF_LED (1 << WB_LED) #define WF_RST (1 << WB_RST) #define RF_DIN (1 << RB_DIN) #define RF_TEST1 (1 << RB_TEST1) #define RF_TEST2 (1 << RB_TEST2) AvrISPInterface::AvrISPInterface(bool use_io) : LptExtInterface(use_io) { //qDebug() << "AvrISPInterface::AvrISPInterface()"; //DeInstall(); //old_portno = GetInstalled(); } void AvrISPInterface::SetControlLine(int res) { qDebug() << "AvrISPInterface::SetControlLine(" << res << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & RESETINV) { res = !res; } //1) Open collector RESET behaviour //OutDataMask(WF_RST|WF_ENA1, !res); //When not resetted leave the RESET in Hi-Z //2) push-pull RESET behaviour OutDataMask(WF_ENA1, 0); //Never leave the RESET in Hi-Z (AVR ISP seems to work in this way) OutDataMask(WF_RST, !res); } } int AvrISPInterface::SetPower(bool onoff) { #ifdef AVRISP_MAPPED if (onoff) { OutDataMask(WF_TEST2, 1); //Some PCs need /BUSY signal high to work properly as suggested by Marek Michalkiewicz OutDataMask(WF_RST | WF_ENA1, 0); OutDataMask(WF_LED, 0); //31/07/99 -- suggested by Ralph Koettlitz OutDataMask(WF_ENA2, 0); } else { OutDataMask(WF_ENA2, 1); OutDataMask(WF_LED, 1); //31/07/99 -- suggested by Ralph Koettlitz OutDataMask(WF_RST | WF_ENA1, 1); } #else if (onoff) { OutDataMask(WF_RST, 1); OutControlMask(WF_LED, 0); OutControlMask(WF_ENA1, 1); } else { OutControlMask(WF_ENA1, 0); OutControlMask(WF_LED, 1); OutDataMask(WF_RST, 0); } #endif qDebug() << "AvrISPInterface::SetPower(" << onoff << ") *** Inst=" << IsInstalled(); return OK; } int AvrISPInterface::Open(int port_no) { qDebug() << "AvrISPInterface::Open(" << port_no << ") IN *** Inst=" << IsInstalled(); int ret_val = OK; if (GetInstalled() != port_no) { if (InDataPort(port_no) < 0) { ret_val = E2ERR_OPENFAILED; } else { Install(port_no); #ifdef AVRISP_MAPPED OutDataMask(WF_ENA1 | WF_ENA2, 1); #else OutControlMask(WF_ENA1, 0); #endif } } qDebug() << "AvrISPInterface::Open() = " << ret_val << " OUT"; return ret_val; } void AvrISPInterface::Close() { qDebug() << "AvrISPInterface::Close() IN *** Inst=" << IsInstalled(); if (IsInstalled()) { LptExtInterface::Close(); DeInstall(); } qDebug() << "AvrISPInterface::Close() OUT"; } void AvrISPInterface::SetDataOut(int sda) { qDebug() << "AvrISPInterface::SetDataOut(" << sda << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity()&DOUTINV) { sda = !sda; } OutDataMask(WF_DOUT, sda ? 1 : 0); } } void AvrISPInterface::SetClock(int scl) { qDebug() << "AvrISPInterface::SetClock(" << scl << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity()&CLOCKINV) { scl = !scl; } OutDataMask(WF_SCK, scl ? 1 : 0); } } void AvrISPInterface::SetClockData() { qDebug() << "AvrISPInterface::SetClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); uint8_t cpreg = GetLastData(); if (control & CLOCKINV) { cpreg &= ~WF_SCK; } else { cpreg |= WF_SCK; } if (control & DOUTINV) { cpreg &= ~WF_DOUT; } else { cpreg |= WF_DOUT; } OutDataPort(cpreg); } } void AvrISPInterface::ClearClockData() { qDebug() << "AvrISPInterface::ClearClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); uint8_t cpreg = GetLastData(); if (control & CLOCKINV) { cpreg |= WF_SCK; } else { cpreg &= ~WF_SCK; } if (control & DOUTINV) { cpreg |= WF_DOUT; } else { cpreg &= ~WF_DOUT; } OutDataPort(cpreg); } } int AvrISPInterface::GetDataIn() { qDebug() << "AvrISPInterface::GetDataIn() *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & DININV) { return ~ InDataPort() & RF_DIN; } else { return InDataPort() & RF_DIN; } } return E2ERR_NOTINSTALLED; } int AvrISPInterface::GetClock() { return 1; } int AvrISPInterface::GetPresence() { qDebug() << "AvrISPInterface::GetPresence() *** Inst=" << IsInstalled(); if (IsInstalled()) { return (InDataPort() & RF_TEST1); } else { return E2ERR_NOTINSTALLED; } } int AvrISPInterface::IsClockDataUP() { qDebug() << "AvrISPInterface::IsClockDataUP() *** Inst=" << IsInstalled(); return GetDataIn(); } int AvrISPInterface::IsClockDataDOWN() { qDebug() << "AvrISPInterface::IsClockDataDOWN() *** Inst=" << IsInstalled(); return !GetDataIn(); } int AvrISPInterface::TestPort(int port) { qDebug() << "AvrISPInterface::TestPort(" << port << ") IN"; int ret_val = TestSave(port); if (ret_val == OK) { int test1 = false, test2 = false; #ifdef AVRISP_MAPPED //Test1 OutDataMask(WF_TEST1, 1); w.WaitMsec(50); if ((InDataPort() & RF_TEST1)) { OutDataMask(WF_TEST1, 0); w.WaitMsec(50); if (!(InDataPort() & RF_TEST1)) { test1 = true; } } #endif //Test2 OutDataMask(WF_TEST2, 0); w.WaitMsec(50); if ((InDataPort() & RF_TEST2)) { OutDataMask(WF_TEST2, 1); w.WaitMsec(50); if (!(InDataPort() & RF_TEST2)) { test2 = true; } } ret_val = (test1 || test2) ? OK : E2ERR_OPENFAILED; } TestRestore(); qDebug() << "AvrISPInterface::TestPort() = " << ret_val << " OUT"; return ret_val; } tmp9balx013/SrcPony/at93cbus.h0000644000175000017500000000567413616566001016145 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT93CBUS_H #define _AT93CBUS_H #include "microbus.h" class At93cBus : public MicroWireBus { public: At93cBus(BusInterface *ptr = 0); //virtual ~At93cBus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); void SetOrganization(int org) { if (org == ORG8 || org == ORG16) { organization = org; } } int GetOrganization() const { return organization; } int Erase(int type = 0); //int CalcAddressSize(int mem_size) const override //{ // return MicroWireBus::CalcAddressSize(mem_size); //} protected: int SendCmdOpcode(int opcode) { return SendDataWord(opcode, 3); } private: //Command Opcode const uint8_t ReadCode; const uint8_t WriteCode; const uint8_t WriteEnableCode; const uint8_t EraseAllCode; const uint8_t PrClearCode; const long loop_timeout; void setCS() { SetReset(); //27/05/98 } void clearCS() { ClearReset(); //27/05/98 } int address_len; int organization; }; #endif tmp9balx013/SrcPony/ponyioint.h0000644000175000017500000000513113616566001016524 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PONYIOINTERFACE_H #define _PONYIOINTERFACE_H #include "businter.h" #include "portint.h" class PonyIOInterface : public BusInterface, public PortInterface { public: PonyIOInterface(); virtual ~PonyIOInterface(); virtual int Open(int com_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn() ; virtual int GetClock() ; virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP() ; virtual int IsClockDataDOWN() ; virtual int TestPort(int port); int SetPower(bool onoff); void SetControlLine(int res = 1); protected: int GetPresence() const; private: }; #endif tmp9balx013/SrcPony/pic168xx.cpp0000644000175000017500000001173313616566001016426 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "pic168xx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include #include "e2cmdw.h" #include "e2awinfo.h" Pic168xx::Pic168xx(e2AppWinInfo *wininfo, BusIO *busp) : Pic16xx(wininfo, busp) { } Pic168xx::~Pic168xx() { } int Pic168xx::CodeProtectAdjust(uint16_t &config, int read) { long type = 0; Pic168xx::QueryType(type); if (type == PIC1684A) { Pic16xx::CodeProtectAdjust(config, read); } else { config = ~config & 0x3fff; } return OK; } typedef struct { int code; int type; } IdType; static IdType IdArray[] = { {0x560, PIC1684A}, // 00 0101 011 0 0000 {0xd00, PIC16870}, // 00 1101 000 0 0000 {0xd20, PIC16871}, // 00 1101 001 0 0000 {0x8e0, PIC16872}, // 00 1000 111 0 0000 {0x960, PIC16873}, // 00 1001 011 0 0000 {0x920, PIC16874}, // 00 1001 001 0 0000 {0x9e0, PIC16876}, // 00 1001 111 0 0000 {0x9a0, PIC16877}, // 00 1001 101 0 0000 {0xe40, PIC16873A}, // 00 1110 0100 XXXX {0xe60, PIC16874A}, // 00 1110 0110 XXXX {0xe00, PIC16876A}, // 00 1110 0000 XXXX {0xe20, PIC16877A}, // 00 1110 0010 XXXX {0x7a0, PIC16627}, // 00 0111 101 x xxxx {0x7c0, PIC16628}, // 00 0111 110 x xxxx {0x00, PIC16800} }; int Pic168xx::QueryType(long &type) { int rv = DEVICE_UNKNOWN; id_locations[6] = 0; if (GetBus()->ReadConfig(id_locations) == OK) { int code = id_locations[6]; qDebug() << "Pic168xx::ParseID() *** " << (hex) << code << (dec); code &= 0x3fe0; //Strip revision number type = 0; int k; for (k = 0; IdArray[k].code != 0x00; k++) { if (IdArray[k].code == code) { type = IdArray[k].type; rv = OK; break; } } } return rv; } int Pic168xx::Probe(int probe_size) { int rv = OK; long type = 0; rv = QueryType(type); // int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); if (probe_size) { if (rv == OK) { SetNoOfBank(GetEEPTypeSize(type)); SetSplitted(GetEEPTypeSplit(type)); rv = GetSize(); } } else { if (cmdWin->GetIgnoreFlag()) { rv = GetSize(); } else { if (rv == OK) { if (GetE2PSubType(GetAWInfo()->GetEEPId()) == subtype) { rv = GetSize(); } else { rv = DEVICE_BADTYPE; } } } } return rv; } int Pic168xx::Write(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if ((type & PROG_TYPE) && (type & DATA_TYPE)) { GetBus()->Erase(ALL_TYPE); } else { GetBus()->Erase(type); } if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = WriteProg(); } if (rv > 0 && GetSize() > GetSplitted()) //check for DATA size { if (type & DATA_TYPE) { rv = WriteData(); } } if (rv > 0 && (type & CONFIG_TYPE)) { // write the config locations // this must be the LAST operation (to exit from config mode we have to clear Vpp) uint32_t f; f = GetAWInfo()->GetLockBits(); SecurityWrite(f); } } } else if (rv == 0) { rv = E2ERR_WRITEFAILED; } return rv; } tmp9balx013/SrcPony/mpsse_interf.cpp0000644000175000017500000005376313616566001017543 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // FTDI mpsse IO #include "mpsse_interf.h" #include "errcode.h" #include "e2cmdw.h" #include #include #include #include MpsseInterface::MpsseInterface() : cmdbuf(), pin_directions(0), ignore_last_data(true), last_data(0), read_data(0), pin_ctrl(0), pin_ctrlin(0), pin_datain(0), pin_dataout(0), pin_clock(0), pin_clockin(0), pin_poweron(0), ftdi_port(FTDI_PORTA), test_step(0) { qDebug() << Q_FUNC_INFO; } MpsseInterface::~MpsseInterface() { qDebug() << Q_FUNC_INFO; Close(); } void MpsseInterface::ConfigPins(int pinum_ctrl, int pinum_datain, int pinum_dataout, int pinum_clock, int pinum_clockin, int pinum_poweron, int pinum_enbus, int pinnum_ctrlin) { BusInterface::ConfigPins(pinum_ctrl, pinum_datain, pinum_dataout, pinum_clock, pinum_clockin, pinum_poweron, pinum_enbus, pinnum_ctrlin); if (pinum_ctrl >= 0) { pin_ctrl = 1 << pinum_ctrl; } if (pinum_datain >= 0) { pin_datain = 1 << pinum_datain; } if (pinum_dataout >= 0) { pin_dataout = 1 << pinum_dataout; } if (pinum_clock >= 0) { pin_clock = 1 << pinum_clock; } if (pinnum_ctrlin >= 0) { pin_ctrlin = 1 << pinnum_ctrlin; } if (pinum_clockin >= 0) { pin_clockin = 1 << pinum_clockin; } if (pinum_poweron >= 0) { pin_poweron = 1 << pinum_poweron; } if (pinum_enbus >= 0) { pin_enbus = 1 << pinum_enbus; } } int MpsseInterface::InitPins() { int result; result = ctx.set_bitmode(0, BITMODE_RESET); if (result == 0) { ignore_last_data = true; last_data = 0; pin_directions = 0; if (pin_ctrl == 0 && pin_clock == 0 && pin_datain == 0 && pin_dataout == 0) { qWarning() << Q_FUNC_INFO << " Unconfigured pins"; return E2ERR_OPENFAILED; } qDebug() << Q_FUNC_INFO << (hex) << " Ctrl=" << pin_ctrl << ", Clock=" << pin_clock << ", ClockIn=" << pin_clockin << ", DataIn=" << pin_datain << ", DataOut=" << pin_dataout << ", Poweron=" << pin_poweron << ", EnBus=" << pin_enbus; result = ctx.set_bitmode(0, BITMODE_MPSSE); if (result == 0) { ctx.flush(); cmdbuf.clear(); int new_data = 0; if (GetI2CMode()) { cmdbuf.append(EN_3_PHASE); new_data |= pin_dataout | pin_clock; //I2C need pins high new_data &= ~pin_enbus; } else { cmdbuf.append(DIS_3_PHASE); new_data |= pin_enbus; } //cmdbuf.append(LOOPBACK_END); //cmdbuf.append(DIS_ADAPTIVE); //00011011 --> 0x1B int new_directions = pin_ctrl | pin_dataout | pin_clock | pin_poweron | pin_enbus; if (usb_vp == TypeToInterfVidPid(FTDI_JTAGKEY)) { new_directions |= (1 << 4) | (1 << 11); //hack } //Force update last_data = ~new_data & 0xffff; pin_directions = ~new_directions & 0xffff; SendPins(new_data, new_directions); //set pins to ZERO result = Flush(); WaitMsec(10); } } return result; } void MpsseInterface::DeInitPins() { //ctx.set_bitmode(0, BITMODE_RESET); } int MpsseInterface::SetFrequency(uint32_t freq) { int32_t divisor, sysclock; Q_ASSERT(freq > 0); if (freq > 6000000) { sysclock = 60000000; cmdbuf.append(DIS_DIV_5); } else { sysclock = 12000000; cmdbuf.append(EN_DIV_5); } divisor = (sysclock / (2 * freq)) - 1; if (divisor < 0) { qDebug() << Q_FUNC_INFO << "Frequency high" << freq; divisor = 0; } if (divisor > 65535) { qDebug() << Q_FUNC_INFO << "Frequency low" << freq; divisor = 65535; } qDebug() << Q_FUNC_INFO << "Frequency" << (sysclock / (2 * (divisor + 1))) << ", Divisor" << divisor << ", SysClock" << sysclock; cmdbuf.append(TCK_DIVISOR); cmdbuf.append(divisor & 0xff); cmdbuf.append((divisor >> 8) & 0xff); return Flush(); } int MpsseInterface::Open(int port) { qDebug() << Q_FUNC_INFO << "(" << port << (hex) << usb_vp.vid << ":" << usb_vp.pid << ") IN"; int ret_val = OK; if (GetInstalled() != port) { ftdi_port = TypeToInterfPort(cmdWin->GetInterfaceType()); ftdi_interface interf = INTERFACE_A; if (ftdi_port == FTDI_PORTB) { interf = INTERFACE_B; } else if (ftdi_port == FTDI_PORTC) { interf = INTERFACE_C; } else if (ftdi_port == FTDI_PORTD) { interf = INTERFACE_D; } int result = ctx.set_interface(interf); if (result == 0) { std::string sdesc, sser; //result = ctx.open(usb_vp.vid, usb_vp.pid); result = ctx.open(usb_vp.vid, usb_vp.pid, sdesc, sser, port); } if (result == 0) { ctx.reset(); //ctx.flush(); ctx.set_read_chunk_size(256); ctx.set_write_chunk_size(1024); //ctx.set_event_char(); //ctx.set_error_char(); //ctx.set_usb_read_timeout(0); //ctx.set_usb_write_timeout(5000); ctx.set_latency(1); result = InitPins(); if (result == 0) { Install(port); } else { ctx.close(); ret_val = E2ERR_OPENFAILED; } } else { qWarning() << Q_FUNC_INFO << ctx.error_string(); ret_val = E2ERR_OPENFAILED; } } qDebug() << Q_FUNC_INFO << "=" << ret_val << "OUT"; return ret_val; } void MpsseInterface::Close() { qDebug() << Q_FUNC_INFO << "IN - Installed: " << IsInstalled(); if (IsInstalled()) { SetPower(false); DeInitPins(); ctx.close(); DeInstall(); } } int MpsseInterface::Flush() { int ret = OK; if (!cmdbuf.isEmpty()) { ret = ctx.write(cmdbuf.getBuffer(), cmdbuf.getSize()); if (ret == cmdbuf.getSize()) { cmdbuf.clear(); ret = OK; } else { qWarning() << Q_FUNC_INFO << "write failed:" << ctx.error_string(); ret = -1; } } return ret; } void MpsseInterface::SetDelay(int delay) { if (delay >= 0) { uint32_t freq = 0xffffffff; //maximum frequency if (delay > 0) { freq = 1000000 / (delay * 2); if (GetI2CMode()) { freq = freq * 3 / 2; //3PHASE_CLOCKING } } SetFrequency(freq); } BusInterface::SetDelay(delay); } void MpsseInterface::ShotDelay(int n) { if (BusInterface::GetDelay() > 0) //avoid any delay if 0 { if (GetI2CMode()) { n *= 3; //I2CBus use 3_PHASE clock } while (n-- > 0) { cmdbuf.append(SET_BITS_LOW); cmdbuf.append(last_data & 0xff); cmdbuf.append(pin_directions & 0xff); } } } int MpsseInterface::SendPins(int new_data, int new_directions) { int ch_data, ch_dir; if (cmdbuf.almostFull()) { Flush(); } if (new_directions >= 0) //-1 don't change directions { ch_dir = (new_directions ^ pin_directions) & 0xffff; } else { new_directions = pin_directions; ch_dir = 0; } //new_data &= ~((1 << 4) | (1 << 11)); //what's changed ch_data = (new_data ^ last_data) & 0xffff; if (ignore_last_data) { ch_data |= 0xff; } if ((ch_data & 0x00ff) != 0 || (ch_dir & 0x00ff) != 0) //low byte { cmdbuf.append(SET_BITS_LOW); cmdbuf.append(new_data & 0xff); cmdbuf.append(new_directions & 0xff); } if ((ch_data & 0xff00) != 0 || (ch_dir & 0xff00) != 0) //high byte { cmdbuf.append(SET_BITS_HIGH); cmdbuf.append((new_data >> 8) & 0xff); cmdbuf.append((new_directions >> 8) & 0xff); } //if (queue_mode || Flush() == OK) { ignore_last_data = false; last_data = new_data; pin_directions = new_directions; } return OK; } int MpsseInterface::GetPins() { if (cmdbuf.almostFull(3)) { Flush(); } cmdbuf.append(GET_BITS_LOW); cmdbuf.append(GET_BITS_HIGH); cmdbuf.append(SEND_IMMEDIATE); int ret = Flush(); if (ret == OK) { uint8_t buf[2]; int timeout = 10000; do { ret = ctx.read(buf, 2); if (ret < 0) { qWarning() << Q_FUNC_INFO << "read failed:" << ctx.error_string(); return -1; } } while (ret == 0 && --timeout > 0); if (timeout > 0) { ret = ((int)buf[1] << 8) | buf[0]; } else { ret = E2P_TIMEOUT; } } return ret; } int MpsseInterface::GetLowPinsMulti(int bufsiz, uint8_t *buf, int len) { if (len > bufsiz) { len = bufsiz; } if (cmdbuf.almostFull(len)) { Flush(); } for (int k = 0; k < len; k++) { cmdbuf.append(GET_BITS_LOW); } cmdbuf.append(SEND_IMMEDIATE); int ret = Flush(); if (ret == OK) { int timeout = 10000; do { ret = ctx.read(buf, len); if (ret < 0) { qWarning() << Q_FUNC_INFO << "read failed:" << ctx.error_string(); return -1; } } while (ret == 0 && --timeout > 0); if (timeout == 0) { ret = E2P_TIMEOUT; } } return ret; } bool MpsseInterface::CheckDataLines(int len, int sda, int scl) { uint8_t buf[512]; bool test = false; Q_ASSERT(len > 0); Q_ASSERT(len <= (int)sizeof(buf)); if (GetLowPinsMulti(sizeof(buf), buf, len) == len) { test = true; for (int k = 0; test && k < len; k++) { if (sda == 0 && scl == 0) { test = IsClockDataDOWN(buf[k]); } else if (sda > 0 && scl > 0) { test = IsClockDataUP(buf[k]); } else { bool test_sda = true, test_scl = true; if (sda > 0) { test_sda = GetDataIn(buf[k]); } else if (sda == 0) { test_sda = !GetDataIn(buf[k]); } if (scl > 0) { test_scl = GetClock(buf[k]); } else if (scl == 0) { test_scl = !GetClock(buf[k]); } test = (test_sda && test_scl); } } } return test; } int MpsseInterface::xferBit(int &err, int b, int mode) { int cmd = MPSSE_BITMODE; int len = 0; //0 --> 1bit int by = (b != 0) ? 0xff : 0; uint8_t ret_byte = 0; //We accept 0 --> default R+W, SPIMODE_WRONLY --> W, SPIMODE_RDONLY --> R, (SPIMODE_WRONLY|SPIMODE_RDONLY) --> Invalid Q_ASSERT((mode & (xMODE_WRONLY | xMODE_RDONLY)) != (xMODE_WRONLY | xMODE_RDONLY)); if ((mode & xMODE_WRONLY) != 0) { cmd |= MPSSE_DO_WRITE; if ((mode & SPIMODE_MASK) == 0 || (mode & SPIMODE_MASK) == 3) { cmd |= MPSSE_WRITE_NEG; } } else if ((mode & xMODE_RDONLY) != 0) { cmd |= MPSSE_DO_READ; if ((mode & SPIMODE_MASK) == 1 || (mode & SPIMODE_MASK) == 2) { cmd |= MPSSE_READ_NEG; } } else { cmd |= (MPSSE_DO_WRITE | MPSSE_DO_READ); if ((mode & SPIMODE_MASK) == 0 || (mode & SPIMODE_MASK) == 3) { cmd |= MPSSE_WRITE_NEG; } else { cmd |= MPSSE_READ_NEG; } } err = OK; if (cmdbuf.almostFull()) { Flush(); } cmdbuf.append(cmd); cmdbuf.append(len); if ((cmd & MPSSE_DO_WRITE) != 0) { cmdbuf.append(by); } if ((cmd & MPSSE_DO_READ) != 0) { cmdbuf.append(SEND_IMMEDIATE); int ret = Flush(); if (ret == OK) { int timeout = 1000; do { ret = ctx.read(&ret_byte, 1); if (ret < 0) { qWarning() << Q_FUNC_INFO << "read failed:" << ctx.error_string(); err = -1; } } while (ret == 0 && --timeout > 0); if (ret == 1) { err = OK; } else { err = E2P_TIMEOUT; } } } ignore_last_data = true; return (ret_byte & 1); } uint8_t MpsseInterface::xferByte(int &err, uint8_t by, int mode, int bpw, bool lsb_first) { int cmd = MPSSE_BITMODE; int len = bpw - 1; //0 --> 1bit, .. 7 --> 8bits uint8_t ret_byte = 0; if (lsb_first) { cmd |= MPSSE_LSB; } //We accept 0 --> default R+W, SPIMODE_WRONLY --> W, SPIMODE_RDONLY --> R, (SPIMODE_WRONLY|SPIMODE_RDONLY) --> Invalid Q_ASSERT((mode & (xMODE_WRONLY | xMODE_RDONLY)) != (xMODE_WRONLY | xMODE_RDONLY)); Q_ASSERT(bpw <= 8); if ((mode & xMODE_WRONLY) != 0) { cmd |= MPSSE_DO_WRITE; if ((mode & SPIMODE_MASK) == 0 || (mode & SPIMODE_MASK) == 3) { cmd |= MPSSE_WRITE_NEG; } } else if ((mode & xMODE_RDONLY) != 0) { cmd |= MPSSE_DO_READ; if ((mode & SPIMODE_MASK) == 1 || (mode & SPIMODE_MASK) == 2) { cmd |= MPSSE_READ_NEG; } } else { cmd |= (MPSSE_DO_WRITE | MPSSE_DO_READ); if ((mode & SPIMODE_MASK) == 0 || (mode & SPIMODE_MASK) == 3) { cmd |= MPSSE_WRITE_NEG; } else { cmd |= MPSSE_READ_NEG; } } err = OK; if (cmdbuf.almostFull()) { Flush(); } cmdbuf.append(cmd); cmdbuf.append(len); if ((cmd & MPSSE_DO_WRITE) != 0) { cmdbuf.append(by); } if ((cmd & MPSSE_DO_READ) != 0) { cmdbuf.append(SEND_IMMEDIATE); int ret = Flush(); if (ret == OK) { int timeout = 1000; do { ret = ctx.read(&ret_byte, 1); if (ret < 0) { qWarning() << Q_FUNC_INFO << "read failed:" << ctx.error_string(); err = -1; } } while (ret == 0 && --timeout > 0); if (ret == 1) { err = OK; } else { err = E2P_TIMEOUT; } } } ignore_last_data = true; return ret_byte; } unsigned long MpsseInterface::xferWord(int &err, unsigned long word_out, int mode, int bpw, bool lsb_first) { int nbit, nshift; unsigned long word_in = 0; if (lsb_first) { nshift = 0; do { nbit = (bpw > 8) ? 8 : bpw; word_in |= (xferByte(err, word_out & 0xff, mode, nbit, true) << nshift); word_out >>= 8; bpw -= nbit; nshift += nbit; } while (bpw > 0); } else { nbit = bpw % 8; nshift = (bpw / 8) * 8; if (nbit > 0) { word_in <<= 8; word_in |= xferByte(err, ((word_out >> nshift) & 0xff) << (8 - nbit), mode, nbit, false); bpw -= nbit; } while (bpw > 0) { nshift -= 8; word_in <<= 8; word_in |= xferByte(err, (word_out >> nshift) & 0xff, mode, 8, false); bpw -= 8; } } return word_in; } int MpsseInterface::SetPower(bool onoff) { qDebug() << Q_FUNC_INFO << "(" << onoff << ")"; if (IsInstalled() && pin_poweron > 0) { if ((cmdWin->GetPolarity() & POWERINV)) { onoff = !onoff; } int val = onoff ? 1 : 0; SendPins(OutDataMask(pin_poweron, val)); Flush(); } return OK; } void MpsseInterface::SetControlLine(int res) { //qDebug() << Q_FUNC_INFO << "(" << res << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & RESETINV) { res = !res; } if (SendPins(OutDataMask(pin_ctrl, (res != 0))) != OK) { qWarning() << Q_FUNC_INFO << "write failed."; } } } void MpsseInterface::SetDataOut(int sda) { //qDebug() << Q_FUNC_INFO << "(" << sda << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & DOUTINV)) { sda = !sda; } if (SendPins(OutDataMask(pin_dataout, (sda != 0))) != OK) { qWarning() << Q_FUNC_INFO << "write failed."; } } } void MpsseInterface::SetClock(int scl) { //qDebug() << Q_FUNC_INFO << "(" << scl << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & CLOCKINV)) { scl = !scl; } if (SendPins(OutDataMask(pin_clock, (scl != 0))) != OK) { qWarning() << Q_FUNC_INFO << "write failed."; } } } void MpsseInterface::SetClockData() { //qDebug() << Q_FUNC_INFO << "*** Inst=" << IsInstalled(); if (IsInstalled()) { int scl = 1, sda = 1; if ((cmdWin->GetPolarity() & CLOCKINV)) { scl = !scl; } if ((cmdWin->GetPolarity() & DOUTINV)) { sda = !sda; } int n_data = OutDataMask(pin_clock, scl); if (SendPins(OutDataMask(n_data, pin_dataout, sda)) != OK) { qWarning() << Q_FUNC_INFO << "write failed."; } } } void MpsseInterface::ClearClockData() { //qDebug() << Q_FUNC_INFO << "*** Inst=" << IsInstalled(); if (IsInstalled()) { int scl = 0, sda = 0; if ((cmdWin->GetPolarity() & CLOCKINV)) { scl = !scl; } if ((cmdWin->GetPolarity() & DOUTINV)) { sda = !sda; } int n_data = OutDataMask(pin_clock, scl); if (SendPins(OutDataMask(n_data, pin_dataout, sda)) != OK) { qWarning() << Q_FUNC_INFO << "write failed."; } } } int MpsseInterface::GetCtrlIn(int val) { if (pin_ctrlin == 0) { return -1; } else { return (val & pin_ctrlin) ? 1 : 0; } } int MpsseInterface::GetDataIn(int val) { val = (val & pin_datain) ? 1 : 0; if (cmdWin->GetPolarity() & DININV) { return !val; } else { return val; } } int MpsseInterface::GetDataIn() { if (IsInstalled()) { int val = GetPins(); if (val < 0) { qWarning() << Q_FUNC_INFO << "read failed."; return val; } else { return GetDataIn(val); } } else { return E2ERR_NOTINSTALLED; } } int MpsseInterface::GetClock(int val) { if (pin_clockin == 0) { return 1; } else { return (val & pin_clockin) ? 1 : 0; } } int MpsseInterface::GetClock() { if (pin_clockin == 0) { return 1; } else { if (IsInstalled()) { int val = GetPins(); if (val < 0) { qWarning() << Q_FUNC_INFO << "read failed."; return val; } else { return GetClock(val); } } else { return E2ERR_NOTINSTALLED; } } } int MpsseInterface::IsClockDataUP(int val) { if (pin_clockin == 0) { return GetDataIn(val); } else { return (GetClock(val) && GetDataIn(val)); } } int MpsseInterface::IsClockDataUP() { if (IsInstalled()) { int val = GetPins(); if (val < 0) { qWarning() << Q_FUNC_INFO << "read failed."; return val; } else { return IsClockDataUP(val); } } else { return E2ERR_NOTINSTALLED; } } int MpsseInterface::IsClockDataDOWN(int val) { if (pin_clockin == 0) { return !GetDataIn(val); } else { return (!GetClock(val) && !GetDataIn(val)); } } int MpsseInterface::IsClockDataDOWN() { if (IsInstalled()) { int val = GetPins(); if (val < 0) { qWarning() << Q_FUNC_INFO << "read failed."; return val; } else { return IsClockDataDOWN(val); } } else { return E2ERR_NOTINSTALLED; } } int MpsseInterface::GetPresence(int mask, int val) { qDebug() << Q_FUNC_INFO << "() *** Inst=" << IsInstalled(); if (IsInstalled()) { int pinval = GetPins(); if (pinval < 0) { qWarning() << Q_FUNC_INFO << "read failed."; return val; } else { return ((pinval & mask) == val) ? OK : E2ERR_OPENFAILED; } } else { return E2ERR_NOTINSTALLED; } } #include int MpsseInterface::TestPort(int port_no) { #if 1 test_step = 0; #endif qDebug() << Q_FUNC_INFO << "(port_no:" << port_no << ", test_step:" << test_step << ") IN"; int ret_val = TestSave(port_no); if (ret_val == OK) { if (TypeToInterfVidPid(PONYPROG_FT) == usb_vp) { if (test_step++ > 0) { bool test_inv = false; int errcount = 0; if (test_step > 2) { QMessageBox mbox; mbox.setText("Passo " + QString::number(test_step) + " Insert check-board"); mbox.exec(); test_step = 0; SendPins(OutDataMask(pin_enbus, 0)); } else { QMessageBox mbox; mbox.setText("Passo " + QString::number(test_step) + " Remove check-board"); mbox.exec(); SendPins(OutDataMask(pin_enbus, 1)); } int val, pmask_clkin = (1 << 4), seto; SetPower(true); w.WaitMsec(150); for (seto = 1; seto >= 0; seto--) { int geti = test_inv ? !seto : seto; SendPins(OutDataMask(pin_dataout, seto)); w.WaitMsec(100); val = GetPins(); if (val < 0) { return E2ERR_NOTINSTALLED; } if ((val & pin_datain) != 0) { val = 1; } else { val = 0; } if (val != geti) { qWarning() << Q_FUNC_INFO << " Data Write " << seto << " read " << val << "(" << geti << ")"; errcount++; } } for (seto = 1; seto >= 0; seto--) { int geti = test_inv ? !seto : seto; SendPins(OutDataMask(pin_clock, seto)); w.WaitMsec(100); val = GetPins(); if (val < 0) { return E2ERR_NOTINSTALLED; } if ((val & pmask_clkin) != 0) { val = 1; } else { val = 0; } if (val != geti) { qWarning() << Q_FUNC_INFO << " Clock Write " << seto << " read " << val << "(" << geti << ")"; errcount++; } } SendPins(OutDataMask(pin_enbus, 1)); SendPins(OutDataMask(pin_ctrl | pin_dataout | pin_clock, 0)); SetPower(false); if (errcount > 0) { ret_val = E2ERR_NOTINSTALLED; } } else { //PonyProgFT w.WaitMsec(10); ret_val = GetPresence(0x0700, 0); if (ret_val == OK) { SendPins(OutDataMask(pin_enbus, 1)); //en_bus active low SendPins(OutDataMask(pin_ctrl | pin_dataout | pin_clock, 0)); SetPower(true); w.WaitMsec(150); int val = GetPins(); if (val < 0 || GetCtrlIn(val) != 1) { if (GetDataIn(val) != 1) { ret_val = E2ERR_IOTEST; } else { ret_val = E2ERR_NOTINSTALLED; } } else { SendPins(OutDataMask(pin_ctrl, 1)); w.WaitMsec(100); val = GetPins(); if (val < 0 || GetCtrlIn(val) != 0) { ret_val = E2ERR_NOTINSTALLED; } } SendPins(OutDataMask(pin_ctrl | pin_dataout | pin_clock, 0)); SetPower(false); } } } else if (TypeToInterfVidPid(FTDI_JTAGKEY) == usb_vp) { //JtagKey ret_val = OK; } else { ret_val = E2ERR_NOTINSTALLED; } } TestRestore(); qDebug() << Q_FUNC_INFO << "() = " << ret_val << " OUT"; return ret_val; } tmp9balx013/SrcPony/imbus.h0000644000175000017500000000610513616566001015615 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _IMBUS_H #define _IMBUS_H #include "busio.h" class IMBus : public BusIO { public: IMBus(BusInterface *ptr = 0); virtual ~IMBus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); int Reset(); void SetDelay(); void SetStatusLocation(int val); void UseSecondaryAddress(bool val); void SetDataMode(int val); void SetProgDelay(int val); protected: int SendAddrWord(int wo); int SendDataWord(long wo, int wlen = 8); int RecDataWord(int wlen = 8); int WaitReadyAfterWrite(int addr, int delay, long timeout = 5000); int IdentPulse(); void setIdent() { busI->SetControlLine(1); } void clearIdent() { busI->SetControlLine(0); } private: int StatusLocation; bool SecondaryAddress; bool Data16_mode; int ProgDelay; int SendDataBit(int b); int RecDataBit(); void bitDI(int b) { busI->SetDataOut(b); } void setDI() { busI->SetDataOut(1); } void clearDI() { busI->SetDataOut(0); } void setCLK() { busI->SetClock(1); } void clearCLK() { busI->SetClock(0); } int getDO() const { return busI->GetDataIn(); } }; #endif tmp9balx013/SrcPony/nvm3060.cpp0000644000175000017500000001132713616566001016144 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "nvm3060.h" // Header file #include "errcode.h" #include "eeptypes.h" #include #include "e2cmdw.h" Nvm3060::Nvm3060(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { qDebug() << "Nvm3060::Nvm3060()"; } Nvm3060::~Nvm3060() { qDebug() << "Nvm3060::~Nvm3060()"; } // determina il numero di banchi (dimensione) dell'eeprom int Nvm3060::Probe(int probe_size) { qDebug() << "Nvm3060::Probe(" << probe_size << ")"; return OK; } int Nvm3060::Read(int probe, int type) { qDebug() << "Nvm3060::Read(" << probe << ")"; if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { int start_addr; if (size > 256) { //NVM3060 GetBus()->SetDataMode(16); GetBus()->SetStatusLocation(526); start_addr = 0; } else { //MDA2062 GetBus()->SetDataMode(8); GetBus()->SetStatusLocation(14); start_addr = 128; } GetBus()->UseSecondaryAddress(false); rv = GetBus()->Read(start_addr, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "Nvm3060::Read() = " << rv; return rv; } int Nvm3060::Write(int probe, int type) { if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { int start_addr; if (size > 256) { //NVM3060 E2Profile::SetNVMProgDelay(E2Profile::GetNVMProgDelay()); GetBus()->SetProgDelay(E2Profile::GetNVMProgDelay()); GetBus()->SetDataMode(16); GetBus()->SetStatusLocation(526); start_addr = 0; } else { //MDA2062 E2Profile::SetMDAProgDelay(E2Profile::GetMDAProgDelay()); GetBus()->SetProgDelay(E2Profile::GetMDAProgDelay()); GetBus()->SetDataMode(8); GetBus()->SetStatusLocation(14); start_addr = 128; } GetBus()->UseSecondaryAddress(false); rv = GetBus()->Write(start_addr, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int Nvm3060::Verify(int type) { if (GetNoOfBank() == 0) { return BADPARAM; } int size = GetNoOfBank() * GetBankSize(); int rval = 1; if (type & PROG_TYPE) { int start_addr; if (size > 256) { //NVM3060 GetBus()->SetDataMode(16); GetBus()->SetStatusLocation(526); start_addr = 0; } else { //MDA2062 GetBus()->SetDataMode(8); GetBus()->SetStatusLocation(14); start_addr = 128; } GetBus()->UseSecondaryAddress(false); unsigned char *localbuf = new unsigned char[size]; rval = GetBus()->Read(start_addr, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } delete[] localbuf; } return rval; } tmp9balx013/SrcPony/pgminter.h0000644000175000017500000000520713616566001016325 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _SIPROGINTERFACE_H #define _SIPROGINTERFACE_H #include "businter.h" #include "rs232int.h" class SIProgInterface : public BusInterface, public RS232Interface { public: SIProgInterface(); // virtual ~SIProgInterface(); virtual int Open(int com_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn() ; virtual int GetClock() ; virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP() ; virtual int IsClockDataDOWN() ; virtual int TestPort(int port); // int TestSave(int port); // void TestRestore(); int SetPower(bool onoff); void SetControlLine(int res = 1); protected: private: }; #endif tmp9balx013/SrcPony/pic125xx.h0000644000175000017500000000523513616566001016064 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PIC125XX_H #define _PIC125XX_H #include "types.h" #include "pic12bus.h" #include "device.h" class Pic125xx : public Device { public: Pic125xx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~Pic125xx(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); //Write lock bits int SecurityRead(uint32_t &bits); int SecurityWrite(uint32_t bits); protected: Pic12Bus *GetBus() { return static_cast(Device::GetBus()); } virtual int CodeProtectAdjust(uint16_t &config, int read = 0); // virtual int WriteProg(); virtual int VerifyProg(unsigned char *localbuf); private: uint16_t config_word; }; #endif tmp9balx013/SrcPony/bitfield.h0000644000175000017500000000670313616566001016264 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef BITFIELDWIDGET_H #define BITFIELDWIDGET_H #include #include #include #include #include #include "ui_bitfield.h" /** * @brief BitInfo is the main structure for displaying in the QTreeWidget */ typedef struct { int bit; // bit number const QString ShortDescr; // first column const QString LongDescr; // second column const QString ExtDescr; // for additional infos } BitInfo; /** * @brief MaskDescr is the structure for QComboBoxes with help information */ typedef struct { const QString mask; // in mask are coded name of mask and bits const QString LongDescr; // const QString ExtDescr; // for additional infos } MaskDescr; class BitFieldWidget : public QWidget, public Ui::FormBitField { Q_OBJECT public: BitFieldWidget(QWidget *parent, QVector &vInfo, QVector &vMask, unsigned int field, const QString &chipNm); virtual ~BitFieldWidget(); // Destructor unsigned int getBitfield(); protected: signals: void displayBitFields(int field); private slots: void onComboSelected(int i); void onBitClicked(QTreeWidgetItem *itm, int col); private: void initWidget(); void scanMasks(); void createComboLists(); void setMaskBits(const QString &m);//, unsigned int bits); bool isExp(unsigned int a); private: QVector lstComboBoxes; QVector *vecInfo; QVector *vecDescr; QString chipName; unsigned int bField; QStringList maskList; // masks QVector maskBitSum; }; #endif tmp9balx013/SrcPony/sde2506.h0000644000175000017500000000463013616566001015567 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _SDE2506XX_H #define _SDE2506XX_H #include "types.h" #include "device.h" #include "sdebus.h" class Sde2506 : public Device { public: Sde2506(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~Sde2506(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: Sde2506Bus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/blockmdlg.h0000644000175000017500000000470613616566001016441 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef BLOCKMDLG_H #define BLOCKMDLG_H // #include #include #include // #include // #include #include "ui_editdlg.h" #include "e2cmdw.h" class blockDialog : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: blockDialog(e2CmdWindow *bw, e2AppWinInfo *p, bool readonly = false, const QString &msg = ""); virtual ~blockDialog(); // Destructor protected: private slots: void onOk(); private: e2AppWinInfo *awip; uint32_t lock, fuse; }; #endif tmp9balx013/SrcPony/device.cpp0000644000175000017500000001437713616566001016302 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "device.h" // Header file #include "e2awinfo.h" Device::Device(e2AppWinInfo *wininfo, BusIO *busp, int b_size) : detected_type(0), awi(wininfo), bus(busp), def_bank_size(b_size), write_progpage_size(0), read_progpage_size(0), write_datapage_size(0), read_datapage_size(0) { detected_signature = ""; DefaultBankSize(); } Device::~Device() { } void Device::SetAWInfo(e2AppWinInfo *wininfo) { if (wininfo) { awi = wininfo; } } int Device::GetAddrSize() const { // return GetEEPAddrSize(awi->GetEEPPriType(), awi->GetEEPSubType()); return GetEEPAddrSize(awi->GetEEPId()); } int Device::GetNoOfBank() const { return awi->GetNoOfBlock(); } void Device::SetNoOfBank(int no) { if (no >= 0) { awi->SetNoOfBlock(no); } } uint8_t *Device::GetBufPtr() const { return (uint8_t *)awi->GetBufPtr(); } int Device::GetBufSize() const { return awi->GetBufSize(); } int Device::GetSplitted() const { return awi->GetSplittedInfo(); } void Device::SetSplitted(int split) { if (split > 0) { awi->SetSplittedInfo(split); } } int Device::GetProgPageSize(bool rnw) const { if (rnw) { return read_progpage_size; } else { return write_progpage_size; } } void Device::SetProgPageSize(int pagesize, bool rnw) { if (rnw) { read_progpage_size = pagesize; } else { write_progpage_size = pagesize; } } int Device::GetDataPageSize(bool rnw) const { if (rnw) { return read_datapage_size; } else { return write_datapage_size; } } void Device::SetDataPageSize(int pagesize, bool rnw) { if (rnw) { read_datapage_size = pagesize; } else { write_datapage_size = pagesize; } } //Read Flash program memory int Device::ReadProg() { int retval; int size = GetSplitted(); int base = 0; retval = GetBus()->Read(0, GetBufPtr() + base, size, read_progpage_size); if (retval != size) { if (retval > 0) { retval = OP_ABORTED; } } return retval; } //Read EEprom data memory int Device::ReadData() { int retval; int size = GetSize() - GetSplitted(); int base = GetSplitted(); retval = GetBus()->Read(1, GetBufPtr() + base, size, read_datapage_size); if (retval != size) { if (retval > 0) { retval = OP_ABORTED; } } return retval; } //Write Flash program memory int Device::WriteProg() { int rv; int size = GetSplitted(); int base = 0; GetBus()->ClearLastProgrammedAddress(); rv = GetBus()->Write(0, GetBufPtr() + base, size, write_progpage_size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } return rv; } //Write EEprom data memory int Device::WriteData() { int rv; int size = GetSize() - GetSplitted(); int base = GetSplitted(); rv = GetBus()->Write(1, GetBufPtr() + base, size, write_datapage_size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } return rv; } int Device::VerifyProg(unsigned char *localbuf) { int rval = -1; int size = GetSplitted(); int base = 0; //Verify only programmed bytes (to save time in big devices) long v_len = size; if (GetBus()->GetLastProgrammedAddress() > 0 && GetBus()->GetLastProgrammedAddress() < size) { v_len = GetBus()->GetLastProgrammedAddress() + 1; GetBus()->ClearLastProgrammedAddress(); //reset last_programmed_addr, so next verify not preceeded by write verify all the flash } //Set blank locations to default 0xFF (erased) memset(localbuf, 0xFF, size); // read the current flash content and store it in localbuf if (read_progpage_size && (v_len % read_progpage_size) == 0) { rval = GetBus()->Read(0, localbuf, v_len, read_progpage_size); } else { rval = GetBus()->Read(0, localbuf, v_len, 0); } if (rval != v_len) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = GetBus()->CompareMultiWord(GetBufPtr() + base, localbuf + base, v_len, 0) == 0 ? OK : 1; } return rval; } int Device::VerifyData(unsigned char *localbuf) { int rval; int size = GetSize() - GetSplitted(); int base = GetSplitted(); //read current EEPROM content and rval = GetBus()->Read(1, localbuf + base, size, read_datapage_size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = GetBus()->CompareMultiWord(GetBufPtr() + base, localbuf + base, size, 1) == 0 ? OK : 1; } return rval; } int Device::ReadCalibration(int addr) { int val; val = Probe(0); if (val >= 0) { val = GetBus()->ReadCalibration(addr); } return val; } tmp9balx013/SrcPony/sde2506.cpp0000644000175000017500000000711513616566001016123 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "sde2506.h" // Header file #include "errcode.h" #include "eeptypes.h" #include "e2awinfo.h" #include Sde2506::Sde2506(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { qDebug() << "Sde2506::Sde2506()"; } Sde2506::~Sde2506() { qDebug() << "Sde2506::~Sde2506()"; } // determina il numero di banchi (dimensione) dell'eeprom int Sde2506::Probe(int probe_size) { qDebug() << "Sde2506::Probe(" << probe_size << ")"; return OK; } int Sde2506::Read(int probe, int type) { qDebug() << "Sde2506::Read(" << probe << ")"; if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Read(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "Sde2506::Read() = " << rv; return rv; } int Sde2506::Write(int probe, int type) { if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Write(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int Sde2506::Verify(int type) { if (GetNoOfBank() == 0) { return BADPARAM; } int rval = 1; if (type & PROG_TYPE) { int size = GetNoOfBank() * GetBankSize(); unsigned char *localbuf = new unsigned char[size]; rval = GetBus()->Read(0, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } delete[] localbuf; } return rval; } tmp9balx013/SrcPony/at17xxx.cpp0000644000175000017500000001407013616566001016355 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // Source for AT1765/... class (FPGA eeproms) #include #include "types.h" #include "e2cmdw.h" #include "at17xxx.h" // Header file #include "errcode.h" #include "eeptypes.h" At17xxx::At17xxx(e2AppWinInfo *wininfo, BusIO *busp) : E24xx(wininfo, busp, 8, 1) { writepage_size = 64; } int At17xxx::WritePage(long addr, int addr_bytes, uint8_t *buf, int len) { int j; int rval; //Write Page rval = GetBus()->Start(eeprom_addr[0] & ~1); if (rval < 0) { return rval; } for (j = addr_bytes - 1; j >= 0; j--) { rval = GetBus()->WriteByte((addr >> (j * 8)) & 0xFF, false); if (rval < 0) { return rval; } } for (j = 0; j < len; j++) { rval = GetBus()->WriteByte(buf[j], true); if (rval < 0) { return rval; } } GetBus()->Stop(); //Data polling for (j = timeout_loop; j > 0 && GetBus()->Start(eeprom_addr[0] & ~1) < 0; j--) ;; if (j == 0) { return E2P_TIMEOUT; } return OK; } int At17xxx::Write(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } GetBus()->WriteStart(); int addr_bytes; long size = GetSize(); if (size > 0xffff) { //512/1024 kbits addr_bytes = 3; writepage_size = 128; } else { //65/128/256 kbits addr_bytes = 2; writepage_size = 64; } int rval = OK; if (type & PROG_TYPE) { long j; for (j = 0; j < size; j += writepage_size) { rval = WritePage(j, addr_bytes, GetBufPtr() + j, writepage_size); if (rval != OK) { break; } if (GetBus()->WriteProgress(j * 100 / size)) { rval = OP_ABORTED; break; } } } GetBus()->WriteEnd(); if (rval == OK) { return GetSize(); } else { return rval; } } int At17xxx::ReadPage(long addr, int addr_bytes, uint8_t *buf, int len) { int j; int rval; if (len < 1) { return BADPARAM; } //Read Page rval = GetBus()->Start(eeprom_addr[0] & ~1); if (rval < 0) { return rval; } for (j = addr_bytes - 1; j >= 0; j--) { rval = GetBus()->WriteByte((addr >> (j * 8)) & 0xFF, false); if (rval < 0) { return rval; } } //Read Bytes rval = GetBus()->Start(eeprom_addr[0] | 1); if (rval < 0) { return rval; } for (j = 0; j < len - 1; j++) { rval = GetBus()->ReadByte(0, true); if (rval < 0) { return rval; } *buf++ = (uint8_t)rval; } //ultimo byte senza ACK rval = GetBus()->ReadByte(1, true); if (rval < 0) { return rval; } *buf++ = (uint8_t)rval; GetBus()->Stop(); return OK; } int At17xxx::Read(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } GetBus()->ReadStart(); int readpage_size; int addr_bytes; long size = GetSize(); if (size > 0xffff) { //512/1024 kbits addr_bytes = 3; readpage_size = 128; } else { //65/128/256 kbits addr_bytes = 2; readpage_size = 64; } error = OK; if (type & PROG_TYPE) { long k; for (k = 0; k < size; k += readpage_size) { error = ReadPage(k, addr_bytes, GetBufPtr() + k, readpage_size); if (error != OK) { break; } if (GetBus()->ReadProgress(k * 100 / size)) { error = OP_ABORTED; break; } } } GetBus()->ReadEnd(); if (error == OK) { return GetSize(); } else { return error; } } int At17xxx::Verify(int type) { int rval = Probe(); //Moved here from 7 lines above (10/12/99) if (rval < 0) { return rval; } int readpage_size; int addr_bytes; long size = GetSize(); if (size > 0xffff) { //512/1024 kbits addr_bytes = 3; readpage_size = 128; } else { //65/128/256 kbits addr_bytes = 2; readpage_size = 64; } unsigned char *localbuf = new unsigned char[readpage_size]; GetBus()->ReadStart(); rval = 1; //true if (type & PROG_TYPE) { long k; for (k = 0; k < size; k += readpage_size) { rval = ReadPage(k, addr_bytes, localbuf, readpage_size); if (rval != OK) { break; } if (memcmp(GetBufPtr() + k, localbuf, readpage_size) != 0) { rval = 0; break; } else { rval = 1; } if (GetBus()->ReadProgress(k * 100 / size)) { rval = OP_ABORTED; break; } } } GetBus()->ReadEnd(); delete[] localbuf; return rval; } tmp9balx013/SrcPony/easyi2c_interf.h0000644000175000017500000000466713616566001017417 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _EASYI2CINTERFACE_H #define _EASYI2CINTERFACE_H #include "lpt_ext_interf.h" class EasyI2CInterface : public LptExtInterface { public: EasyI2CInterface(bool use_io = false); virtual int Open(int com_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn() ; virtual int GetClock() ; virtual void SetClockData(); virtual int IsClockDataUP() ; virtual int IsClockDataDOWN() ; virtual int TestPort(int port); protected: private: }; #endif tmp9balx013/SrcPony/at90sxx.h0000644000175000017500000000515013616566001016015 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT90SXX_H #define _AT90SXX_H #include "types.h" #include "device.h" #include "at90sbus.h" class At90sxx : public Device { public: At90sxx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~At90sxx(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); int Erase(int probe = 1, int type = ALL_TYPE); int SecurityRead(uint32_t &bits); int SecurityWrite(uint32_t bits); int FusesRead(uint32_t &bits); int FusesWrite(uint32_t bits); At90sBus *GetBus() { return static_cast(Device::GetBus()); } protected: int QueryType(long &type); private: }; #endif tmp9balx013/SrcPony/x2444.cpp0000644000175000017500000000704413616566001015621 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "x2444.h" // Header file #include "errcode.h" #include "eeptypes.h" #include X2444::X2444(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 2) { qDebug() << "X2444::X2444()"; DefaultBankSize(); } void X2444::DefaultBankSize() { if (GetBus() == 0) { Device::DefaultBankSize(); } else { if (GetBus()->GetOrganization() == ORG16) { SetBankSize(2); } else { SetBankSize(1); } } } int X2444::Read(int probe, int type) { qDebug() << "X2444::Read(" << probe << ")"; if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Read(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "X2444::Read() = " << rv; return rv; } int X2444::Write(int probe, int type) { if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Write(0, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int X2444::Verify(int type) { if (GetNoOfBank() == 0) { return BADPARAM; } int rval = 1; if (type & PROG_TYPE) { int size = GetNoOfBank() * GetBankSize(); unsigned char *localbuf; localbuf = new unsigned char[size]; rval = GetBus()->Read(0, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } delete[] localbuf; } return rval; } tmp9balx013/SrcPony/e2awinfo.h0000644000175000017500000002240413616566001016210 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef e2AWINFO_H #define e2AWINFO_H #include #include #include #include #include #include "types.h" #include "device.h" //AutoTag //Include Device Classes #include "e24xx.h" #include "e2401.h" #include "e24xx-1.h" #include "e24xx-2.h" #include "e24xx-5.h" #include "at90sxx.h" #include "at89sxx.h" #include "at93cxx.h" #include "at93cxx8.h" #include "pic16xx.h" #include "pic168xx.h" #include "pic125xx.h" #include "at250xx.h" #include "at25xxx.h" #include "sde2506.h" #include "nvm3060.h" #include "at17xxx.h" #include "x2444.h" #include "filebuf.h" #include "e2pfbuf.h" #include "binfbuf.h" #include "intfbuf.h" #include "motsfbuf.h" #include "csmfbuf.h" #include "eeptypes.h" #include "e2phead.h" //At the moment the bigger device is ATmega2560 (256KiB + 4KiB) #define BUFFER_SIZE (1024 * 260) #define STRINGID_SIZE E2P_STRID_SIZE #define COMMENT_SIZE E2P_COMM_SIZE #define LINEBUF_SIZE 128 class e2CmdWindow; class e2AppWinInfo // : public QObject { public: e2AppWinInfo(e2CmdWindow *p = 0, const QString &name = "", BusIO **busptr = 0); ~e2AppWinInfo(); int Read(int type = ALL_TYPE, int raise_power = true, int leave_on = false); int Write(int type = ALL_TYPE, int raise_power = true, int leave_on = false); int Verify(int type = ALL_TYPE, int raise_power = true, int leave_on = false); int Erase(int type = ALL_TYPE, int raise_power = true, int leave_on = false); // int BlankCheck(int type = ALL_TYPE, int raise_power = true, int leave_on = false); // int Load(int bank = 0); int Load(); int Save(); QString Dump(int line, int type = 0); int GetNoOfBlock() const { return no_block; } void SetNoOfBlock(int blk) { no_block = blk; } int GetBlockSize() const { return block_size; } long GetSize() const; int GetHexPerLine() const { return hex_per_line; } // void SetEEProm(int type = E24XX, int subtype = 0); void SetEEProm(unsigned long id = E2400); void SetFileBuf(FileType type); FileType GetFileBuf() const; bool SetFileName(const QString &name); QString GetFileName() { return fname; } QString GetStringID(); void SetStringID(const QString &s); QString GetComment(); void SetComment(const QString &s); int GetEEPId() const { return eep_id; } #if 0 int GetEEPPriType() const { return eep_type; } int GetEEPSubType() const { return eep_subtype ? eep_subtype : GetE2PSubType(GetEEPTypeFromSize(eep_type, GetNoOfBlock())); } //GetNoOfBlock(); } int GetEEPType() const { return BuildE2PType(eep_type, eep_subtype); } #endif // void SetEEPTypeId(unsigned long e2type_id); int GetBankRollOver() const { return roll_over; } void SetBankRollOver(int rlv = 0) { roll_over = rlv; } int BankRollOverDetect(int force = 0); void Reset(); long GetSplittedInfo() const { return splitted; } void SetSplittedInfo(long spl = 0) { splitted = spl; } uint16_t GetCRC() const { return crc; } void SetCRC(int c = 0) { crc = c; } uint16_t RecalcCRC(); uint8_t *GetBufPtr() const { return (uint8_t *)buffer; } int GetBufSize() const { return buffer_size; } void DoubleSize(); void SwapBytes(); void FillBuffer(int first_pos = 0, int ch = 0xFF, long len = -1); void ClearBuffer(int type = ALL_TYPE); int SecurityRead(uint32_t &bits); int SecurityWrite(uint32_t bits, bool no_param = false); int FusesRead(uint32_t &bits); int FusesWrite(uint32_t bits, bool no_param = false); int HighEnduranceRead(uint32_t &block_no); int HighEnduranceWrite(uint32_t block_no, bool no_param = false); int ReadOscCalibration(int addr = 0); uint32_t GetLockBits() const { return lock_bits; } uint32_t GetFuseBits() const { return fuse_bits; } void SetLockBits(uint32_t bits); void SetFuseBits(uint32_t bits); bool IsFuseValid() const { return fuse_ok; } bool IsBufferValid() const { return buf_ok; } void BufChanged(bool val = true) { buf_changed = val; } bool IsBufChanged() const { return buf_changed; } int SetLoadType(int val); int GetLoadType() const; int SetSaveType(int val); int GetSaveType() const; void SetLoadRelocation(long val); long GetLoadRelocation() const; void SetSaveRelocation(long val); long GetSaveRelocation() const; bool GetLoadAutoClearBuf() { return clear_buffer_before_load; } void SetLoadAutoClearBuf(bool val) { clear_buffer_before_load = val; } long GetDetectedType() const { return eep ? eep->GetDetectedType() : 0; } QString GetDetectedTypeStr() const { return GetEEPTypeString(GetDetectedType()); } QString GetDetectedSignatureStr() const { return eep ? eep->GetDetectedSignatureStr() : ""; } protected: // e2CmdWindow* cmdWin; private: int OpenBus(); void SleepBus(); void SetBlockSize(int blk) { block_size = blk; } int LoadFile(); QString fname; //nome del file int const hex_per_line; int const buffer_size; int load_type; //load ALL, Flash only or EEPROM only int save_type; //save ALL, Flash only or EEPROM only long load_relocation; long save_relocation; bool clear_buffer_before_load; //flag, clear buffer before load a file // bool clear_buffer_before_read; //flag, clear buffer before read from device // EK 2017 // TODO convert to QByteArray or QBuffer? uint8_t buffer[BUFFER_SIZE]; //device content buffer QString linebuf;//[LINEBUF_SIZE]; //print line buffer bool buf_ok; //true if buffer is valid bool buf_changed; //true if buffer changed/edited unsigned long eep_id; // int eep_type; //indica il tipo di chip di eeprom // int eep_subtype; //sottotipo (in pratica il numero di banchi) //se zero viene usato GetNoOfBank(), serve per una forzatura manuale int block_size; //dimensione del blocco (puo` essere anche 1, dipende dal tipo di eeprom) int no_block; //numero dei blocchi che contiene l'eeprom, indica la dimensione int splitted; //indica se la EEPROM e` divisa in due parti distinte (EEPROM - FLASH) int roll_over; //indica se e`presente una features della eeprom uint32_t fuse_bits; //device dependent bits uint32_t lock_bits; //device dependent lock (security) bits bool fuse_ok; uint16_t crc; //CRC del contenuto della eeprom QString eeprom_string;//[STRINGID_SIZE]; //eeprom string ID QString eeprom_comment;//[COMMENT_SIZE]; //eeprom comment //current device pointer (can be any of the following list) Device *eep; //AutoTag //List of available device types E24xx *eep24xx; mE2401 *eep2401; E24xx1 *eep24xx1; E24xx2 *eep24xx2; E24xx5 *eep24xx5; At90sxx *eepAt90s; At89sxx *eepAt89s; At93cxx *eep93xx16; At93cxx8 *eep93xx8; Pic16xx *eepPic16; Pic168xx *eepPic168xx; Pic125xx *eepPic125xx; At250xx *eep250xx; At25xxx *eep25xxx; Sde2506 *eep2506; Nvm3060 *eep3060; At17xxx *eep17xxx; X2444 *eep2444; X2444 *eep2430; FileBuf *fbufp; //current filebuffer pointer FileBuf *fbufvet[NO_OF_FILETYPE]; //filebuffer list //List of available file types e2pFileBuf e2pfbuf; binFileBuf binfbuf; IntelFileBuf intfbuf; MotorolaSFileBuf motsfbuf; csmFileBuf csmfbuf; }; #endif tmp9balx013/SrcPony/fusemdlg.cpp0000644000175000017500000054134613616566001016652 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "fusemdlg.h" #include #include #include //=========================================================================// // // E. Kalinowski // description for fuse/lock bits is under: // http://eleccelerator.com/fusecalc/ // http://www.engbedded.com/cgi-bin/fcx.cgi? // //=========================================================================// fuseModalDialog::fuseModalDialog(e2CmdWindow *bw, e2AppWinInfo *p, bool readonly, const QString &msg) : QDialog(bw) { setupUi(this); setWindowTitle(translate(STR_MSGFUSEDLG)); awip = p; fuseWidget = NULL; lockWidget = NULL; cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } qDebug() << "fuseModalDialog::fuseModalDialog()"; read = write = false; setTextWidgets(); initWidgets(msg, readonly); connect(pushRead, SIGNAL(clicked()), this, SLOT(onRead())); connect(pushWrite, SIGNAL(clicked()), this, SLOT(onProg())); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } fuseModalDialog::~fuseModalDialog() { qDebug() << "fuseModalDialog::~fuseModalDialog()"; } void fuseModalDialog::setTextWidgets() { pushRead->setText(translate(STR_BTNREAD)); pushWrite->setText(translate(STR_BTNWRITE)); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); } void fuseModalDialog::onOk() { if (read == true) { emit done(2); } else { awip->SetLockBits(lockBits); awip->SetFuseBits(fuseBits); if (write == true) { emit done(3); } else { accept(); } } } void fuseModalDialog::onProg() { write = true; emit onOk(); } void fuseModalDialog::onRead() { read = true; emit onOk(); } int fuseModalDialog::eepFindFuses(long type) { for (int k = 0; k < eep_bits.count(); k++) { for (int t = 0; t < eep_bits.at(k).type.count(); t++) { if (eep_bits.at(k).type.at(t) == type) { return k; } } } return -1; } void fuseModalDialog::getLock(int l) { lockBits = l; displayBitFields(); } void fuseModalDialog::getFuse(int l) { fuseBits = l; displayBitFields(); } /** * @brief */ void fuseModalDialog::initWidgets(const QString &msg, bool readonly) { long type = cmdw->GetCurrentChipType(); fuseEnabled = true; lockEnabled = true; QString nm = GetEEPTypeString(type); chkHlp1->setText(translate(STR_FUSEDLGNOTECLR) + " (bit = 1)"); chkHlp1->setEnabled(false); chkHlp0->setText(translate(STR_FUSEDLGNOTESET) + " (bit = 0)"); chkHlp0->setChecked(true); chkHlp0->setEnabled(false); if (readonly) { pushOk->setEnabled(false); pushWrite->setEnabled(false); } else { pushOk->setEnabled(true); pushWrite->setEnabled(true); } currentChip = eepFindFuses(type); if (currentChip < 0) { return; } currentBitField = eep_bits.at(currentChip); unsigned int f = awip->GetFuseBits(); if (currentBitField.fuse.count() > 0) { fuseWidget = new BitFieldWidget(this, currentBitField.fuse, currentBitField.fuseDescr, f, nm); tabWidget->addTab(fuseWidget, "Fuse"); connect(fuseWidget, SIGNAL(displayBitFields(int)), this, SLOT(getFuse(int))); fuseBits = fuseWidget->getBitfield(); } else { fuseEnabled = false; } unsigned int l = awip->GetLockBits(); if (currentBitField.lock.count() > 0) { lockWidget = new BitFieldWidget(this, currentBitField.lock, currentBitField.lockDescr, l, nm); tabWidget->addTab(lockWidget, "Lock"); connect(lockWidget, SIGNAL(displayBitFields(int)), this, SLOT(getLock(int))); lockBits = lockWidget->getBitfield(); } else { lockEnabled = false; } displayBitFields(); } void fuseModalDialog::displayBitFields() { QString s; if (fuseEnabled == true) { s = QString().sprintf("Fuse: 0x%08X ", fuseBits); } if (lockEnabled == true) { s += QString().sprintf("Lock: 0x%08X", lockBits); } labelFuseLock->setText(s); } QVector fuseModalDialog::eep_bits = { { { AT89S8252, AT89S53 }, // ??? { // fuse }, { // fuse mask description }, { // lock { 5, "LB5", "", "" }, { 6, "LB6", "", "" }, { 7, "LB7", "", "" } }, { // lock mask description { "LB=000", "Mode 1: No memory lock features enabled", "" }, { "LB=001", "Mode 2: MOVC disabled", "" }, { "LB=011", "Mode 3: Verify disabled", "" }, { "LB=111", "Mode 4: External execution disabled", "" } } }, { { AT89S8253 }, // ??? { // fuse { 0, "ClkSel", "", "" }, { 1, "UserRow", "", "" }, { 2, "x2Mode", "", "" }, { 3, "SerProg", "", "" } }, { // fuse mask description }, { // lock { 0, "LB0", "", "" }, { 1, "LB1", "", "" }, { 2, "LB2", "", "" } }, { // lock mask description { "LB=000", "Mode 1: No memory lock features enabled", "" }, { "LB=001", "Mode 2: MOVC disabled", "" }, { "LB=011", "Mode 3: Verify disabled", "" }, { "LB=111", "Mode 4: External execution disabled", "" } } }, { { AT89S51, AT89S52 }, // ??? { // fuse }, { // fuse mask description }, { // lock { 2, "LB2", "", "" }, { 3, "LB3", "", "" }, { 4, "LB4", "", "" } }, { // lock mask description { "LB=000", "Mode 1: No memory lock features enabled", "" }, { "LB=001", "Mode 2: MOVC disabled", "" }, { "LB=011", "Mode 3: Verify disabled", "" }, { "LB=111", "Mode 4: External execution disabled", "" } } }, { { AT90CAN32, AT90CAN64, AT90CAN128 }, { // fuse // byte low { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTC7", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, // byte high { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watchdog timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, // byte ext { 16, "TA0SEL", "Reserved for factory tests", "" }, { 17, "BODLEVEL0", "", "" }, { 18, "BODLEVEL1", "", "" }, { 19, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0-16.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0-16.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0-16.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0-16.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0-16.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms; Int. Cap.", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms; Int. Cap.", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms; Int. Cap.", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BOOTSZ=10", "Boot Flash section size=1024 words Boot start address=$nC00", "AT90CAN32: $3C00, AT90CAN64: $7C00, AT90CAN128: $FC00" }, { "BOOTSZ=01", "Boot Flash section size=2048 words Boot start address=$n800", "AT90CAN32: $3800, AT90CAN64: $7800, AT90CAN128: $F800" }, { "BOOTSZ=00", "Boot Flash section size=4096 words Boot start address=$n000", "AT90CAN32: $3000, AT90CAN64: $7000, AT90CAN128: $F000" }, { "BOOTSZ=11", "Boot Flash section size=512 words Boot start address=$nE00", "AT90CAN32: $3E00, AT90CAN64: $7E00, AT90CAN128: $FE00" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=000", "Brown-out detection level at VCC=2.5 V", "" }, { "BODLEVEL=001", "Brown-out detection level at VCC=2.6 V", "" }, { "BODLEVEL=010", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=011", "Brown-out detection level at VCC=3.8 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=3.9 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=4.0 V", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=4.1 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { AT90S1200 }, { // fuse { 0, "/FB0", "NOT External clock enabled", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description }, { // lock { 1, "LB1", "", "" }, { 2, "LB2", "", "" } }, { // lock mask description { "LB=11", "Mode 1: No memory lock features enabled", "" }, { "LB=10", "Mode 2: Further programming disabled", "" }, { "LB=00", "Mode 3: Further programming and verification disabled", "" } } }, { { AT90S2313, AT90S4414, AT90S8515, AT90S4434, AT90S8535 }, { // fuse { 0, "FSTRT", "Short start-up time enabled", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { AT90S2333, AT90S4433 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "BODEN", "Brown-out detection enabled", "" }, { 4, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7V", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description { "CKSEL=101", "Ceramic Resonator", "" }, { "CKSEL=111", "Ceramic Resonator; BOD Enabled or power-on reset", "" }, { "CKSEL=110", "Ceramic Resonator; fast rising power", "" }, { "CKSEL=100", "Crystal Oscillator; BOD Enabled or power-on reset", "" }, { "CKSEL=010", "Crystal Oscillator; default value", "" }, { "CKSEL=011", "Crystal Oscillator; fast rising power", "" }, { "CKSEL=001", "External Clock; BOD Enabled or power-on reset", "" }, { "CKSEL=000", "External Clock; slowly rising power", "" } }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { AT90S2323, AT90S8534 }, { // fuse { 0, "FSTRT", "Short start-up time enabled", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { AT90S2343 }, { // fuse { 0, "/FB0", "NOT External clock enabled", "" }, // enabled but invert { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny12 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "RSTDISBL", "External reset function of PB5 disabled", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=1.8 V", "" } }, { // fuse mask description ??? { "CKSEL=0000", "External Clock", "" }, { "CKSEL=0001", "External Clock", "" }, { "CKSEL=0010", "Internal RC Ocsillator", "" }, { "CKSEL=0011", "Internal RC Ocsillator", "" }, { "CKSEL=0100", "Internal RC Ocsillator", "" }, { "CKSEL=0101", "External RC Ocsillator", "" }, { "CKSEL=0110", "External RC Ocsillator", "" }, { "CKSEL=0111", "External RC Ocsillator", "" }, { "CKSEL=1000", "External Low-Frequency Crystal", "" }, { "CKSEL=1001", "External Low-Frequency Crystal", "" }, { "CKSEL=1010", "External Crystal / Ceramic Resonator", "" }, { "CKSEL=1011", "External Crystal / Ceramic Resonator", "" }, { "CKSEL=1100", "External Crystal / Ceramic Resonator", "" }, { "CKSEL=1101", "External Crystal / Ceramic Resonator", "" }, { "CKSEL=1110", "External Crystal / Ceramic Resonator", "" }, { "CKSEL=1111", "External Crystal / Ceramic Resonator", "" } }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny13 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "SUT0", "", "" }, { 3, "SUT1", "", "" }, { 4, "CKDIV8", "Divide clock by 8 internally", "" }, { 5, "WDTON", "Watch-dog Timer always on", "" }, { 6, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 7, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 8, "RSTDISBL", "Reset Disabled (Enable PB5 as i/o pin)", "" }, { 9, "BODLEVEL0", "", "" }, { 10, "BODLEVEL1", "", "" }, { 11, "DWEN", "Debug Wire enable", "" }, { 12, "SELFPRGEN", "Self Programming enable", "" } }, { // fuse mask description { "CKSEL=00 SUT=00", "Ext. Clock; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=00 SUT=01", "Ext. Clock; Start-up time: 14 CK + 4 ms", "" }, { "CKSEL=00 SUT=10", "Ext. Clock; Start-up time: 14 CK + 64 ms", "" }, { "CKSEL=11 SUT=00", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=11 SUT=01", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 4 ms", "" }, { "CKSEL=11 SUT=10", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 64 ms", "" }, { "CKSEL=01 SUT=00", "Int. RC Osc. 4.8 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=01 SUT=01", "Int. RC Osc. 4.8 MHz; Start-up time: 14 CK + 4 ms", "" }, { "CKSEL=01 SUT=10", "Int. RC Osc. 4.8 MHz; Start-up time: 14 CK + 64 ms", "" }, { "CKSEL=10 SUT=00", "Int. RC Osc. 9.6 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=10 SUT=01", "Int. RC Osc. 9.6 MHz; Start-up time: 14 CK + 4 ms", "" }, { "CKSEL=10 SUT=10", "Int. RC Osc. 9.6 MHz; Start-up time: 14 CK + 64 ms", "" }, { "BODLEVEL=11", "Brown-out detection disabled", "" }, { "BODLEVEL=10", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=01", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=00", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny15 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 4, "RSTDISBL", "External reset function of PB5 disabled", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" } }, { // fuse mask description { "CKSEL=00", "Slowly rising power", "" }, { "CKSEL=01", "Slowly rising power", "" }, { "CKSEL=10", "Quickly rising power", "" }, { "CKSEL=11", "Very quickly rising power", "" } }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny22 }, { // fuse { 0, "/FB0", "NOT External clock disabled", "" }, // NOT enabled { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny26 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses)", "" }, { 7, "PLLCK0", "", "" }, { 8, "BODEN", "Brown-out detection enabled", "" }, { 9, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 10, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 11, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 12, "RSTDISBL", "Reset Disabled (Enable PB7 as i/o pin)", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00 PLLCK=1", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01 PLLCK=1", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10 PLLCK=1", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01 PLLCK=1", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01 PLLCK=1", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01 PLLCK=1", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00 PLLCK=1", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01 PLLCK=1", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10 PLLCK=1", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00 PLLCK=1", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01 PLLCK=1", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10 PLLCK=1", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11 PLLCK=1", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00 PLLCK=1", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01 PLLCK=1", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10 PLLCK=1", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11 PLLCK=1", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00 PLLCK=1", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01 PLLCK=1", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10 PLLCK=1", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11 PLLCK=1", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00 PLLCK=1", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01 PLLCK=1", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10 PLLCK=1", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11 PLLCK=1", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00 PLLCK=1", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01 PLLCK=1", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10 PLLCK=1", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00 PLLCK=1", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01 PLLCK=1", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10 PLLCK=1", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00 PLLCK=1", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01 PLLCK=1", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10 PLLCK=1", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00 PLLCK=1", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01 PLLCK=1", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10 PLLCK=1", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0001 SUT=11 PLLCK=0", "PLL Clock; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=0001 SUT=00 PLLCK=0", "PLL Clock; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0001 SUT=01 PLLCK=0", "PLL Clock; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=0001 SUT=10 PLLCK=0", "PLL Clock; Start-up time: 1K CK + 64 ms", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny2313, ATtiny4313 }, // ATtiny4313 new 16.09.2015 @RG, EK : possible diff descriptions for bit combinations { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTD2", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PA2 as i/o pin)", "" }, { 16, "SELFPRGEN", "Self programming enable", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Int. RC Osc. 128 kHz; Start-up time: 14 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 14 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 14 CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 14 CK + 65 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny24, ATtiny44, ATtiny84 }, // new 08.01.2015 @RG, EK : possible diff descriptions for bit combinations { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB2", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PB5 as i/o pin)", "" }, { 16, "SELFPRGEN", "Self Programming enable", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=0001 SUT=01", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4 ms", "" }, { "CKSEL=0001 SUT=11", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 64 ms", "" }, { "CKSEL=0001 SUT=00", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=001", "Brown-out detection level at VCC=1.9 V", "" }, { "BODLEVEL=000", "Brown-out detection level at VCC=2.0 V", "" }, { "BODLEVEL=010", "Brown-out detection level at VCC=2.2 V", "" }, { "BODLEVEL=011", "Brown-out detection level at VCC=2.3 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny25, ATtiny45, ATtiny85 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB4", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PB5 as i/o pin)", "" }, { 16, "SELFPRGEN", "Self Programming enable", "" } }, { // fuse mask description { "CKSEL=0011 SUT=11", "ATtiny15 Comp: Int. RC Osc. 6.4 MHz; Start-up time PWRDWN/RESET: 1 CK/14 CK + 0 ms", "" }, { "CKSEL=0011 SUT=10", "ATtiny15 Comp: Int. RC Osc. 6.4 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0011 SUT=00", "ATtiny15 Comp: Int. RC Osc. 6.4 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=0011 SUT=01", "ATtiny15 Comp: Int. RC Osc. 6.4 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=0001 SUT=01", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4 ms", "" }, { "CKSEL=0001 SUT=11", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 64 ms", "" }, { "CKSEL=0001 SUT=00", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATtiny261, ATtiny461, ATtiny861 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB5", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PB7 as i/o pin)", "" }, { 16, "SELFPRGEN", "Self Programming enable", "" } }, { // fuse mask description { "CKSEL=1000 SUT=10", "Ext. Ceramic Res.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Ceramic Res.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Ceramic Res.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Ceramic Res.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Ceramic Res.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Ceramic Res.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Ceramic Res.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Ceramic Res.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Ceramic Res.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Ceramic Res.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Ceramic Res.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Ceramic Res.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Ceramic Res.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Ceramic Res.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Ceramic Res.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Ceramic Res.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Ceramic Res.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Ceramic Res.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Ceramic Res.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Ceramic Res.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1 CK 4 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, { "CKSEL=0001 SUT=11", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 68 ms", "" }, { "CKSEL=0001 SUT=01", "PLL Clock; Start-up time PWRDWN/RESET: 16K CK/14 CK + 8 ms", "" }, { "CKSEL=0001 SUT=10", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 68 ms", "" }, { "CKSEL=0001 SUT=00", "PLL Clock; Start-up time PWRDWN/RESET: 1K CK/14 CK + 8 ms", "" }, { "CKSEL=0011 SUT=00", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "WD. Osc. 128 kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms", "" }, // brown out { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=001", "Brown-out detection level at VCC=1.9 V", "" }, { "BODLEVEL=000", "Brown-out detection level at VCC=2.0 V", "" }, { "BODLEVEL=010", "Brown-out detection level at VCC=2.2 V", "" }, { "BODLEVEL=011", "Brown-out detection level at VCC=2.3 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATmega48 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB0", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PB6 as i/o pin)", "" }, { 16, "SELFPRGEN", "Self Programming enable", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 65 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATmega88, ATmega168 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB0", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BODLEVEL0", "", "" }, { 9, "BODLEVEL1", "", "" }, { 10, "BODLEVEL2", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PC6 as i/o pin)", "" }, { 16, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 17, "BOOTSZ0", "", "" }, { 18, "BOOTSZ1", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 65 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" }, // extended { "BOOTSZ=00", "Boot Flash section size=1024 words Boot start address=$xC00", "Atmega88: $0C00, ATmega168: $1C00" }, { "BOOTSZ=11", "Boot Flash section size=128 words Boot start address=$xF80", "Atmega88: $0F80, ATmega168: $1F80" }, { "BOOTSZ=10", "Boot Flash section size=256 words Boot start address=$xF00", "Atmega88: $0F00, ATmega168: $1F00" }, { "BOOTSZ=01", "Boot Flash section size=512 words Boot start address=$xE00", "Atmega88: $0E00, ATmega168: $1E00" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega328 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB0", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "DWEN", "Debug Wire enable", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PC6 as i/o pin)", "" }, { 16, "BODLEVEL0", "", "" }, { 17, "BODLEVEL1", "", "" }, { 18, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 0 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 0 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 1K CK /14 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 258 CK/14 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 1K CK/14 CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time PWRDWN/RESET: 32K CK/14 CK + 65 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 128kHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 65 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$3C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$3800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$3F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$3E00", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega164 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB1", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 16, "BODLEVEL0", "", "" }, { 17, "BODLEVEL1", "", "" }, { 18, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Full Swing Oscillator; Start-up time: 16K CK + 0 ms; Crystal Osc.; BOD enabled", "" }, { "CKSEL=0111 SUT=10", "Full Swing Oscillator; Start-up time: 16K CK + 4.1 ms; Crystal Osc.; fast rising power", "" }, { "CKSEL=0111 SUT=11", "Full Swing Oscillator; Start-up time: 16K CK + 65 ms; Crystal Osc.; slowly rising power", "" }, { "CKSEL=0110 SUT=10", "Full Swing Oscillator; Start-up time: 1K CK + 0 ms; Ceramic res.; BOD enable", "" }, { "CKSEL=0110 SUT=11", "Full Swing Oscillator; Start-up time: 1K CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0111 SUT=00", "Full Swing Oscillator; Start-up time: 1K CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0110 SUT=00", "Full Swing Oscillator; Start-up time: 258 CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0110 SUT=01", "Full Swing Oscillator; Start-up time: 258 CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0011 SUT=00", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=512 words Boot start address=$1C00", "" }, { "BOOTSZ=00", "Boot Flash section size=1024 words Boot start address=$1800", "" }, { "BOOTSZ=11", "Boot Flash section size=128 words Boot start address=$1F00", "" }, { "BOOTSZ=10", "Boot Flash section size=256 words Boot start address=$1E00", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega324 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB1", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 16, "BODLEVEL0", "", "" }, { 17, "BODLEVEL1", "", "" }, { 18, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Full Swing Oscillator; Start-up time: 16K CK + 0 ms; Crystal Osc.; BOD enabled", "" }, { "CKSEL=0111 SUT=10", "Full Swing Oscillator; Start-up time: 16K CK + 4.1 ms; Crystal Osc.; fast rising power", "" }, { "CKSEL=0111 SUT=11", "Full Swing Oscillator; Start-up time: 16K CK + 65 ms; Crystal Osc.; slowly rising power", "" }, { "CKSEL=0110 SUT=10", "Full Swing Oscillator; Start-up time: 1K CK + 0 ms; Ceramic res.; BOD enable", "" }, { "CKSEL=0110 SUT=11", "Full Swing Oscillator; Start-up time: 1K CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0111 SUT=00", "Full Swing Oscillator; Start-up time: 1K CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0110 SUT=00", "Full Swing Oscillator; Start-up time: 258 CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0110 SUT=01", "Full Swing Oscillator; Start-up time: 258 CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0011 SUT=00", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$3C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$3800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$3F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$3E00", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega640, ATmega644, ATmega1280, ATmega1281, ATmega1284, ATmega2560, ATmega2561 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTE7", "" }, // EK: different ports { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watch-dog Timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 16, "BODLEVEL0", "", "" }, { 17, "BODLEVEL1", "", "" }, { 18, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0111 SUT=01", "Full Swing Oscillator; Start-up time: 16K CK + 0 ms; Crystal Osc.; BOD enabled", "" }, { "CKSEL=0111 SUT=10", "Full Swing Oscillator; Start-up time: 16K CK + 4.1 ms; Crystal Osc.; fast rising power", "" }, { "CKSEL=0111 SUT=11", "Full Swing Oscillator; Start-up time: 16K CK + 65 ms; Crystal Osc.; slowly rising power", "" }, { "CKSEL=0110 SUT=10", "Full Swing Oscillator; Start-up time: 1K CK + 0 ms; Ceramic res.; BOD enable", "" }, { "CKSEL=0110 SUT=11", "Full Swing Oscillator; Start-up time: 1K CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0111 SUT=00", "Full Swing Oscillator; Start-up time: 1K CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0110 SUT=00", "Full Swing Oscillator; Start-up time: 258 CK + 4.1 ms; Ceramic res.; fast rising power", "" }, { "CKSEL=0110 SUT=01", "Full Swing Oscillator; Start-up time: 258 CK + 65 ms; Ceramic res.; slowly rising power", "" }, { "CKSEL=0011 SUT=00", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. 128kHz RC Osc.; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=2048 words Boot start address=$n800", "ATmega640: $7800, ATmega644: $7800, ATmega1280: $F800, ATmega1281: $F800, ATmega1284: $F800, ATmega2560: $1800 ATmega2560: $1800" }, { "BOOTSZ=00", "Boot Flash section size=4096 words Boot start address=$n000", "ATmega640: $7000, ATmega644: $7000, ATmega1280: $F000, ATmega1281: $F000, ATmega1284: $F000, ATmega2560: $1000 ATmega2560: $1000" }, { "BOOTSZ=11", "Boot Flash section size=512 words Boot start address=$nE00", "ATmega640: $7E00, ATmega644: $7E00, ATmega1280: $FE00, ATmega1281: $FE00, ATmega1284: $FE00, ATmega2560: $1E00 ATmega2560: $1E00" }, { "BOOTSZ=10", "Boot Flash section size=1024 words Boot start address=$nC00", "ATmega640: $7C00, ATmega644: $7C00, ATmega1280: $FC00, ATmega1281: $FC00, ATmega1284: $FC00, ATmega2560: $1C00 ATmega2560: $1C00" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega603 }, // ??? { // fuse { 0, "SUT0", "", "" }, { 1, "SUT1", "", "" }, { 3, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description { "SUT=00", "Start-up time=5 CPU cycles", "" }, { "SUT=01", "Start-up time=0.5 ms", "" }, { "SUT=10", "Start-up time=4.0 ms", "" }, { "SUT=11", "Start-up time=16.0 ms", "" } }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATmega103 }, { // fuse { 0, "SUT0", "", "" }, { 1, "SUT1", "", "" }, { 3, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" } }, { // fuse mask description { "SUT=00", "Start-up time=5 CPU cycles", "" }, { "SUT=01", "Start-up time=0.5 ms", "" }, { "SUT=10", "Start-up time=4.0 ms", "" }, { "SUT=11", "Start-up time=16.0 ms", "" } }, { // lock { 1, "Lock1", "", "" }, { 2, "Lock2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" } } }, { { ATmega8 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "WDTON", "Watch-dog Timer always on", "" }, { 15, "RSTDISBL", "Reset Disabled (Enable PC6 as i/o pin)", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$0C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$0800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$0F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$0E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega8515, ATmega8535 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses)", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "WDTON", "Watch-dog Timer always on", "" }, { 15, "S8515C", "AT90S4414/8515 compatibility mode", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$0C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$0800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$0F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$0E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega64, ATmega128 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses)", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 16, "WDTON", "Watchdog Timer always on", "" }, { 17, "M103C", "ATmega103 Compatibility Mode", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$xC00", "ATmega64: $7C00, ATmega128: $FC00" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$x800", "ATmega64: $7800, ATmega128: $F800" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$xF00", "ATmega64: $7F00, ATmega128: $FF00" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$xE00", "ATmega64: $7E00, ATmega128: $FE00" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega16 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses)", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$1C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$1800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$1F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$1E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega161 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "SUT", "Start-up time", "" }, { 4, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 5, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" } }, { // fuse mask description { "CKSEL=000", "External Clock; fast rising power", "" }, { "CKSEL=001", "External Clock; BOD Enabled or power-on reset", "" }, { "CKSEL=010", "Crystal Oscillator; slowly rising power", "" }, { "CKSEL=011", "Crystal Oscillator; fast rising power", "" }, { "CKSEL=100", "Crystal Oscillator; BOD Enabled or power-on reset", "" }, { "CKSEL=101", "Ceramic Resonator / External Clock; Slowly rising power", "" }, { "CKSEL=110", "Ceramic Resonator; fast rising power", "" }, { "CKSEL=111", "Ceramic Resonator; BOD Enabled or power-on reset", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega163 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 5, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" } }, { // fuse mask description { "CKSEL=0000", "External Clock fast rising power", "" }, { "CKSEL=0001", "External Clock BOD enabled", "" }, { "CKSEL=0010", "Internal RC Ocsillator slowly rising power", "" }, { "CKSEL=0011", "Internal RC Ocsillator fast rising power", "" }, { "CKSEL=0100", "Internal RC Oscillator BOD enabled", "" }, { "CKSEL=0101", "External RC Oscillator slowly rising power", "" }, { "CKSEL=0110", "External RC Oscillator fast rising power", "" }, { "CKSEL=0111", "External RC Oscillator BOD enabled", "" }, { "CKSEL=1000", "External Low-Frequency Crystal", "" }, { "CKSEL=1001", "External Low-Frequency Crystal", "" }, { "CKSEL=1010", "Crystal Oscillator slowly rising power", "" }, { "CKSEL=1011", "Crystal Oscillator fast rising power", "" }, { "CKSEL=1100", "Crystal Oscillator BOD enabled", "" }, { "CKSEL=1101", "Ceramic Resonator/External Clock slowly rising power", "" }, { "CKSEL=1110", "Ceramic Resonator fast rising power", "" }, { "CKSEL=1111", "Ceramic Resonator BOD enabled", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$1C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$1800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$1F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$1E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega162 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTB0", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watchdog timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 17, "BODLEVEL0", "", "" }, { 18, "BODLEVEL1", "", "" }, { 19, "BODLEVEL2", "", "" }, { 20, "M161C", "ATmega161 compatibility mode", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0100 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms; Int. Cap.", "" }, { "CKSEL=0100 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms; Int. Cap.", "" }, { "CKSEL=0100 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms; Int. Cap.", "" }, { "CKSEL=0101 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms; Int. Cap.", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" }, { "BOOTSZ=01", "Boot Flash section size=512 words Boot start address=$1E00", "" }, { "BOOTSZ=00", "Boot Flash section size=1024 words Boot start address=$1C00", "" }, { "BOOTSZ=11", "Boot Flash section size=128 words Boot start address=$1F80", "" }, { "BOOTSZ=10", "Boot Flash section size=256 words Boot start address=$1F00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega169 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "CKOUT", "Clock output on PORTE7", "" }, { 7, "CKDIV8", "Divide clock by 8 internally", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "WDTON", "Watchdog timer always on", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" }, { 16, "RSTDISBL", "Reset Disabled (Enable PG5 as i/o pin)", "" }, { 17, "BODLEVEL0", "", "" }, { 18, "BODLEVEL1", "", "" }, { 19, "BODLEVEL2", "", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 65 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. Crystal Osc.; Frequency 0.4-0.9 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal Osc.; Frequency 0.9-3.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal Osc.; Frequency 3.0-8.0 MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 4.1 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 258 CK + 65 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4.1 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 65 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 4.1 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 65 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc.; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc.; Start-up time: 6 CK + 4.1 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc.; Start-up time: 6 CK + 65 ms", "" }, { "BODLEVEL=111", "Brown-out detection disabled", "" }, { "BODLEVEL=110", "Brown-out detection level at VCC=1.8 V", "" }, { "BODLEVEL=101", "Brown-out detection level at VCC=2.7 V", "" }, { "BODLEVEL=100", "Brown-out detection level at VCC=4.3 V", "" }, { "BOOTSZ=01", "Boot Flash section size=512 words Boot start address=$1E00", "" }, { "BOOTSZ=00", "Boot Flash section size=1024 words Boot start address=$1C00", "" }, { "BOOTSZ=11", "Boot Flash section size=128 words Boot start address=$1F80", "" }, { "BOOTSZ=10", "Boot Flash section size=256 words Boot start address=$1F00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega323 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory during through Chip Erase Cycle", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" } }, { // fuse mask description { "CKSEL=0000", "External Clock fast rising power", "" }, { "CKSEL=0001", "External Clock BOD enabled", "" }, { "CKSEL=0010", "Internal RC Ocsillator slowly rising power", "" }, { "CKSEL=0011", "Internal RC Ocsillator fast rising power", "" }, { "CKSEL=0100", "Internal RC Oscillator BOD enabled", "" }, { "CKSEL=0101", "External RC Oscillator slowly rising power", "" }, { "CKSEL=0110", "External RC Oscillator fast rising power", "" }, { "CKSEL=0111", "External RC Oscillator BOD enabled", "" }, { "CKSEL=1000", "External Low-Frequency Crystal", "" }, { "CKSEL=1001", "External Low-Frequency Crystal", "" }, { "CKSEL=1010", "Crystal Oscillator slowly rising power", "" }, { "CKSEL=1011", "Crystal Oscillator fast rising power", "" }, { "CKSEL=1100", "Crystal Oscillator BOD enabled", "" }, { "CKSEL=1101", "Ceramic Resonator/External Clock slowly rising power", "" }, { "CKSEL=1110", "Ceramic Resonator fast rising power", "" }, { "CKSEL=1111", "Ceramic Resonator BOD enabled", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$3C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$3800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$3F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$3E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { ATmega32 }, { // fuse { 0, "CKSEL0", "", "" }, { 1, "CKSEL1", "", "" }, { 2, "CKSEL2", "", "" }, { 3, "CKSEL3", "", "" }, { 4, "SUT0", "", "" }, { 5, "SUT1", "", "" }, { 6, "BODEN", "Brown-out detection enabled", "" }, { 7, "/BODLEVEL", "NOT Brown-out detection level at VCC=2.7 V", "" }, { 8, "BOOTRST", "Boot Reset vector Enabled (default address=$0000)", "" }, { 9, "BOOTSZ0", "", "" }, { 10, "BOOTSZ1", "", "" }, { 11, "EESAVE", "Preserve EEPROM memory through the Chip Erase cycle", "" }, { 12, "CKOPT", "CKOPT fuse (operation dependent of CKSEL fuses)", "" }, { 13, "SPIEN", "Serial program downloading (SPI) enabled", "" }, { 14, "JTAGEN", "JTAG Interface Enabled", "" }, { 15, "OCDEN", "On-Chip Debug Enabled", "" } }, { // fuse mask description { "CKSEL=0000 SUT=00", "Ext. Clock; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0000 SUT=01", "Ext. Clock; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0000 SUT=10", "Ext. Clock; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=1111 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1111 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1111 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1110 SUT=10", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1110 SUT=11", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1111 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1110 SUT=00", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1110 SUT=01", "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1011 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1011 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1011 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1010 SUT=10", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1010 SUT=11", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1011 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1010 SUT=00", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1010 SUT=01", "Ext. Crystal/Resonator Low Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1101 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 0 ms", "" }, { "CKSEL=1101 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 4 ms", "" }, { "CKSEL=1101 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 16K CK + 64 ms", "" }, { "CKSEL=1100 SUT=10", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 0 ms", "" }, { "CKSEL=1100 SUT=11", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1101 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1100 SUT=00", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 4 ms", "" }, { "CKSEL=1100 SUT=01", "Ext. Crystal/Resonator Medium Freq.; Start-up time: 258 CK + 64 ms", "" }, { "CKSEL=1001 SUT=00", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 4 ms", "" }, { "CKSEL=1001 SUT=01", "Ext. Low-Freq. Crystal; Start-up time: 1K CK + 64 ms", "" }, { "CKSEL=1001 SUT=10", "Ext. Low-Freq. Crystal; Start-up time: 32K CK + 64 ms", "" }, { "CKSEL=0101 SUT=00", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0101 SUT=01", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0101 SUT=10", "Ext. RC Osc. - 0.9 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0101 SUT=11", "Ext. RC Osc. - 0.9 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0110 SUT=00", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0110 SUT=01", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0110 SUT=10", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0110 SUT=11", "Ext. RC Osc. 0.9 MHz - 3.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0111 SUT=00", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=0111 SUT=01", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=0111 SUT=10", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=0111 SUT=11", "Ext. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=1000 SUT=00", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 0 ms", "" }, { "CKSEL=1000 SUT=01", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 4 ms", "" }, { "CKSEL=1000 SUT=10", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 18 CK + 64 ms", "" }, { "CKSEL=1000 SUT=11", "Ext. RC Osc. 8.0 MHz - 12.0 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=00", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0001 SUT=01", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0001 SUT=10", "Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0010 SUT=00", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0010 SUT=01", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0010 SUT=10", "Int. RC Osc. 2 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0011 SUT=00", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0011 SUT=01", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0011 SUT=10", "Int. RC Osc. 4 MHz; Start-up time: 6 CK + 64 ms", "" }, { "CKSEL=0100 SUT=00", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms", "" }, { "CKSEL=0100 SUT=01", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 4 ms", "" }, { "CKSEL=0100 SUT=10", "Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms", "" }, { "BOOTSZ=01", "Boot Flash section size=1024 words Boot start address=$3C00", "" }, { "BOOTSZ=00", "Boot Flash section size=2048 words Boot start address=$3800", "" }, { "BOOTSZ=11", "Boot Flash section size=256 words Boot start address=$3F00", "" }, { "BOOTSZ=10", "Boot Flash section size=512 words Boot start address=$3E00", "" } }, { // lock { 0, "Lock1", "", "" }, { 1, "Lock2", "", "" }, { 2, "BootLock1", "", "" }, { 3, "BootLock2", "", "" }, { 4, "BootLoad1", "", "" }, { 5, "BootLoad2", "", "" } }, { // lock mask description { "Lock=11", "Mode 1: No memory lock features enabled", "" }, { "Lock=10", "Mode 2: Further programming disabled", "" }, { "Lock=00", "Mode 3: Further programming and verification disabled", "" }, { "BootLock=11", "Application Protection Mode 1: No lock on SPM and LPM in Application Section", "" }, { "BootLock=10", "Application Protection Mode 2: SPM prohibited in Application Section", "" }, { "BootLock=00", "Application Protection Mode 3: LPM and SPM prohibited in Application Section", "" }, { "BootLock=01", "Application Protection Mode 4: LPM prohibited in Application Section", "" }, { "BootLoad=11", "Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section", "" }, { "BootLoad=10", "Boot Loader Protection Mode 2: SPM prohibited in Boot Loader Section", "" }, { "BootLoad=00", "Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section", "" }, { "BootLoad=01", "Boot Loader Protection Mode 4: LPM prohibited in Boot Loader Section", "" } } }, { { PIC12508, PIC12509, PIC12508A, PIC12509A, PIC12E518, PIC12E519 }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "WDTE", "Watchdog timer enable", "" }, { 3, "CP", "Code protection bit", "" }, { 4, "/MCLRE", "NOT MCLR enable bit", "" } }, { // lock mask description { "FOSC=11", "EXTRC - external RC oscillator", "" }, { "FOSC=10", "INTRC - internal RC oscillator", "" }, { "FOSC=01", "XT oscillator", "" }, { "FOSC=00", "LP oscillator", "" } } }, { { PIC12671, PIC12672, PIC12673, PIC12674 }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "FOSC2", "", "" }, { 3, "WDTE", "Watchdog Timer Enable", "" }, { 4, "/PWRTE", "NOT Power-up Timer Enable", "" }, { 5, "CP0", "", "" }, { 6, "CP1", "", "" }, { 7, "MCLRE", "Master Clear Reset Enable", "" }, { 8, "CP0", "", "" }, { 9, "CP1", "", "" }, { 10, "CP0", "", "" }, { 11, "CP1", "", "" }, { 12, "CP0", "", "" }, { 13, "CP1", "", "" } }, { // lock mask description { "FOSC=111", "EXTRC, Clockout on OSC2", "" }, { "FOSC=110", "EXTRC, OSC2 is I/O", "" }, { "FOSC=101", "INTRC, Clockout on OSC2", "" }, { "FOSC=100", "INTRC, OSC2 is I/O", "" }, { "FOSC=011", "Invalid Selection", "" }, { "FOSC=010", "HS Oscillator", "" }, { "FOSC=001", "XT Oscillator", "" }, { "FOSC=000", "LP Oscillator", "" }, { "CP=11", "Code protection off", "" }, { "CP=10", "Locations 400h through 7FEh code protected", "" }, { "CP=01", "Locations 200h through 7FEh code protected", "" }, { "CP=00", "All memory is code protected", "" } } }, { { PIC1683, PIC1684, PIC1684A }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "WDTE", "Watchdog timer enable", "" }, { 3, "/PWRTE", "NOT Power-up Timer Enable", "" }, { 4, "CP", "Code protection", "" } }, { // lock mask description { "FOSC=11", "EXTRC - external RC oscillator", "" }, { "FOSC=10", "INTRC - internal RC oscillator", "" }, { "FOSC=01", "XT oscillator", "" }, { "FOSC=00", "LP oscillator", "" } } }, { { PIC16870, PIC16871, PIC16872, PIC16873, PIC16874, PIC16876, PIC16877 }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "WDTE", "Watchdog Timer Enable", "" }, { 3, "/PWRTE", "NOT Power-up Timer Enable", "" }, { 4, "CP0", "", "" }, { 5, "CP1", "", "" }, { 6, "BODEN", "Brown-out Reset Enable", "" }, { 7, "LVP", "Low Voltage In-Circuit Serial Programming Enable", "" }, { 8, "CPD", "Data EE Memory Code Protection", "" }, { 9, "WRT", "FLASH Program Memory Write Enable", "" }, { 11, "DEBUG", "In-Circuit Debugger Mode", "" }, { 12, "CP0", "", "" }, { 13, "CP1", "", "" } }, { // lock mask description { "FOSC=11", "RC oscillator", "" }, { "FOSC=10", "HS oscillator", "" }, { "FOSC=01", "XT oscillator", "" }, { "FOSC=00", "LP oscillator", "" }, { "CP=11", "Code protection off", "" }, { "CP=10", "1F00h to 1FFFh code protected", "" }, { "CP=01", "1000h to 1FFFh code protected", "" }, { "CP=00", "0000h to 1FFFh code protected", "" } } }, { { PIC16873A, PIC16874A, PIC16876A, PIC16877A }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "WDTEN", "Watchdog Timer Enable", "" }, { 3, "/PWRTEN", "NOT Power-up Timer Enable", "" }, { 6, "BOREN", "Brown-out Reset Enable", "" }, { 7, "LVP", "Low-Voltage (Single-Supply)", "" }, { 8, "CPD", "Data EEPROM Memory Code Protection", "" }, { 9, "WRT0", "", "" }, { 11, "WRT1", "", "" }, { 12, "DEBUG", "In-Circuit Debugger Mode", "" }, { 14, "CP", "Flash Program Memory Code Protection", "" } }, { // lock mask description { "FOSC=11", "RC oscillator", "" }, { "FOSC=10", "HS oscillator", "" }, { "FOSC=01", "XT oscillator", "" }, { "FOSC=00", "LP oscillator", "" }, { "WRT=11", "Write protection off; all program memory may be written to by EECON control", "" }, { "WRT=10", "0000h to 00FFh write-protected; 0100h to 0FFFh may be written to by EECON control", "" }, { "WRT=01", "0000h to 03FFh write-protected; 0400h to 0FFFh may be written to by EECON control", "" }, { "WRT=11", "0000h to 07FFh write-protected; 0800h to 0FFFh may be written to by EECON control", "" } } }, { { PIC16627, PIC16628 }, { // fuse }, { // fuse mask description }, { // lock { 0, "FOSC0", "", "" }, { 1, "FOSC1", "", "" }, { 2, "WDTEN", "Watchdog Timer Enable", "" }, { 3, "/PWRTEN", "NOT Power-up Timer Enable", "" }, { 4, "FOSC2", "", "" }, { 5, "MCLRE", "RA5/MCLR pin function select", "" }, { 6, "BOREN", "Brown-out Detect Reset Enable", "" }, { 7, "LVP", "Low Voltage Programming Enable", "" }, { 8, "CPD", "Data Code Protection", "" }, { 10, "CP0", "", "" }, { 11, "CP1", "", "" }, { 12, "CP0", "", "" }, { 13, "CP1", "", "" } }, { // lock mask description { "FOSC=111", "ER oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN", "" }, { "FOSC=110", "ER oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN", "" }, { "FOSC=101", "INTRC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN", "" }, { "FOSC=100", "INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN", "" }, { "FOSC=011", "EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN", "" }, { "FOSC=010", "HS oscillator: High speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN", "" }, { "FOSC=001", "XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN", "" }, { "FOSC=000", "LP oscillator: Low power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN", "" }, { "CP=11", "Program memory code protection off", "" }, { "CP=10", "Program memory code protection off", "" }, { "CP=01", "0200h-03FFh code protected", "" }, { "CP=00", "0000h-03FFh code protected", "" } } } }; tmp9balx013/SrcPony/busio.h0000644000175000017500000001144613616566001015623 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _BUSIO_H #define _BUSIO_H #include "types.h" #include "businter.h" #include "errcode.h" //Formato di bus generico seriale class BusIO { public: BusIO(BusInterface *p = 0); //virtual ~BusIO() { } virtual int Open(int port) { Q_CHECK_PTR(busI); err_no = busI->Open(port); return err_no; } virtual void Close() { Q_CHECK_PTR(busI); busI->Close(); } virtual int Error(); virtual int TestPort(int port) { (void)port; return OK; } virtual int Reset() = 0; virtual long Read(int addr, uint8_t *data, long length, int page_size = 0) = 0; virtual long Write(int addr, uint8_t const *data, long length, int page_size = 0) = 0; virtual int Erase(int type = 0) { (void)type; return NOTSUPPORTED; } void ReadStart() { CheckAbort(0); } void ReadEnd() { CheckAbort(100); } int ReadProgress(int progress) { return CheckAbort(progress); } void WriteStart() { CheckAbort(0); } void WriteEnd() { CheckAbort(100); } int WriteProgress(int progress) { return CheckAbort(progress); } void EraseStart() { CheckAbort(0); } void EraseEnd() { CheckAbort(100); } virtual int ReadDeviceCode(int addr) { (void)addr; return OK; } virtual int WriteLockBits(uint32_t val, long model = 0) { (void)val; (void)model; return OK; } virtual int WriteFuseBits(uint32_t val, long model = 0) { (void)val; (void)model; return OK; } virtual uint32_t ReadLockBits(long model = 0) { (void)model; return 0; } virtual uint32_t ReadFuseBits(long model = 0) { (void)model; return 0; } virtual long ReadCalibration(int addr = 0) { (void)addr; return -1; //No calibration value available } virtual int CompareMultiWord(uint8_t *data1, uint8_t *data2, long length, int split) { (void)split; return memcmp(data1, data2, length); } int GetErrNo() { return err_no; } int GetLastAddr() const //useful in I2C Bus transaction, { return last_addr; // tell the address where error occurs } void SetBusInterface(BusInterface *ptr) { if (ptr) { busI = ptr; } } int GetDelay() const { Q_CHECK_PTR(busI); return busI->GetDelay(); } long GetLastProgrammedAddress() const { return last_programmed_addr; } void ClearLastProgrammedAddress() { last_programmed_addr = 0; } void SetLastProgrammedAddress(long addr) { if (addr > last_programmed_addr) { last_programmed_addr = addr; } } void WaitMsec(unsigned int msec) { Q_CHECK_PTR(busI); busI->WaitMsec(msec); } protected: int err_no; //error code int last_addr; BusInterface *busI; void WaitUsec(unsigned int usec) { Q_CHECK_PTR(busI); busI->WaitUsec(usec); } void ShotDelay(int n = 1) { Q_CHECK_PTR(busI); busI->ShotDelay(n); } private: int CheckAbort(int progress = 0); int old_progress; long last_programmed_addr; //record last programmed address for verify }; #endif tmp9balx013/SrcPony/intfbuf.cpp0000644000175000017500000002674513616566001016502 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include //Estensione al formato Intel Extended HEX #include #include // #include // #include #define MAXLINE 520 #define DATA_RECORD 00 //record contain the data bytes #define END_RECORD 01 //record mark end of file #define SEG_ADDR_RECORD 02 //record contain the new segmented address (HEX86) #define START_RECORD 03 //record contain the program entry point (HEX86) #define LIN_ADDR_RECORD 04 //record contain the new linear address (HEX386) #define EXT_START_RECORD 05 //record contain the program entry point (HEX386) #include "types.h" #include "intfbuf.h" // Header file #include "errcode.h" #include "crc.h" #include "e2awinfo.h" IntelFileBuf::IntelFileBuf(e2AppWinInfo *wininfo) : FileBuf(wininfo) { file_type = INTEL; } IntelFileBuf::~IntelFileBuf() { } int IntelFileBuf::WriteRecord(QFile &fh, uint8_t *bptr, long curaddr, long recsize, int fmt) { int rval = 1; int discard; int j; //check for empty data record (all FF's) if (fmt == DATA_RECORD) { discard = 1; for (j = 0; j < recsize; j++) { if (bptr[curaddr + j] != 0xFF) { discard = 0; break; } } } else { discard = 0; } if (!discard) { int checksum = 0; int len = recsize; QTextStream out(&fh); out << ":"; //byte count out << QString().sprintf("%02X", len & 0xFF); checksum += len & 0xFF; //addr field out << QString().sprintf("%04lX", curaddr & 0xFFFF); checksum += (curaddr >> 8) & 0xFF; checksum += curaddr & 0xFF; //record type out << QString().sprintf("%02X", fmt & 0xFF); checksum += fmt & 0xFF; for (j = 0; j < recsize; j++) { out << QString().sprintf("%02X", bptr[curaddr + j]); checksum += bptr[curaddr + j]; } out << QString().sprintf("%02X\n", (~checksum + 1) & 0xFF); } return rval; } int IntelFileBuf::WriteAddressRecord(QFile &fh, long curaddr, bool linear_address) { int rval = 1; QTextStream out(&fh); out << ":"; int checksum = 0; int len = 2; //byte count out << QString().sprintf("%02X", len & 0xFF); checksum += len & 0xFF; //addr field out << QString().sprintf("%04X", 0); if (linear_address) { //record type out << QString().sprintf("%02X", LIN_ADDR_RECORD & 0xFF); checksum += LIN_ADDR_RECORD & 0xFF; //adjust extended linear address curaddr >>= 16; } else { //record type out << QString().sprintf("%02X", SEG_ADDR_RECORD & 0xFF); checksum += SEG_ADDR_RECORD & 0xFF; //adjust extended segmented address curaddr >>= 4; } out << QString().sprintf("%04lX", curaddr & 0xFFFF); checksum += (curaddr >> 8) & 0xFF; checksum += curaddr & 0xFF; out << QString().sprintf("%02X\n", (~checksum + 1) & 0xFF); return rval; } #define min(a,b) ( (a < b) ? a : b ) int IntelFileBuf::Save(int savetype, long relocation_offset) { QFile fh(FileBuf::GetFileName()); int rval = OK; (void)relocation_offset; if (!fh.open(QIODevice::WriteOnly | QIODevice::Text)) { return CREATEERROR; } long dsize = FileBuf::GetBlockSize() * FileBuf::GetNoOfBlock(); long size = FileBuf::GetBufSize(); uint8_t *ptr = FileBuf::GetBufPtr(); //Remove FF's tail while (ptr[size - 1] == 0xFF) { size--; } if (savetype == PROG_TYPE) { if (GetSplitted() > 0 && GetSplitted() <= dsize) { size = GetSplitted(); } else { fh.close(); return 0; } } else if (savetype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < dsize) { ptr += GetSplitted(); size = dsize - GetSplitted(); } else { fh.close(); return 0; } } if (size > 0) { long curaddr = 0; while (curaddr < size) { //Write extended address record if needed if ((curaddr / 0x10000) > 0 && (curaddr % 0x10000) == 0) if (!WriteAddressRecord(fh, curaddr)) { rval = WRITEERROR; break; } int recsize = min((size - curaddr), 16); if (!WriteRecord(fh, ptr, curaddr, recsize, DATA_RECORD)) { rval = WRITEERROR; break; } curaddr += recsize; } WriteRecord(fh, ptr, 0, 0, END_RECORD); //26/08/99 rval = curaddr; } else { rval = NOTHINGTOSAVE; } fh.close(); return rval; } int IntelFileBuf::Load(int loadtype, long relocation_offset) { int rval = OK; int okline_counter = 0; uint8_t *endp = GetBufPtr() + GetBufSize(); uint8_t *dp = GetBufPtr(); if (loadtype == DATA_TYPE) { if (GetSplitted() >= 0 && GetSplitted() < GetBufSize()) { dp += GetSplitted(); } else { return 0; } } //Relocation check if (dp + relocation_offset > endp) { return BADPARAM; } else { dp += relocation_offset; } uint32_t laddr = 0; QFile fh(GetFileName()); if (!fh.open(QIODevice::ReadOnly | QIODevice::Text)) { return FILENOTFOUND; } int img_size = 0; QString riga; //[MAXLINE + 1]; // riga[MAXLINE] = '\0'; QTextStream stream(&fh); while (!stream.atEnd()) { riga = stream.readLine(); // char *s; int pos; if ((pos = riga.indexOf(":")) < 0) { continue; } else { pos++; } //Byte Count uint16_t bcount; if (!ScanHex(riga.mid(pos, 2), bcount)) { rval = BADFILETYPE; break; } else { pos += 2; } uint8_t checksum = (uint8_t)bcount; //Address uint16_t addr; if (!ScanHex(riga.mid(pos, 4), addr)) { rval = BADFILETYPE; break; } else { pos += 4; } checksum += (uint8_t)(addr >> 8); checksum += (uint8_t)addr; //affect only low 16 bits of address laddr &= 0xFFFF0000; laddr |= addr; //Record Type uint16_t rectype; if (!ScanHex(riga.mid(pos, 2), rectype)) { rval = BADFILETYPE; break; } else { pos += 2; } checksum += (uint8_t)rectype; //Data Byte uint16_t data; if (rectype == DATA_RECORD) { //controllo overflow if (dp + laddr + bcount > endp) { rval = BUFFEROVERFLOW; break; } bool ok = true; uint8_t *p; unsigned int k; for (k = 0, p = dp + laddr; k < bcount && ok; k++) { if (!ScanHex(riga.mid(pos, 2), data)) { ok = false; } else { pos += 2; } checksum += (uint8_t)data; *p++ = (uint8_t)data; } if (!ok) //salta alla riga successiva { rval = BADFILETYPE; break; } img_size = laddr + bcount; } else if (rectype == SEG_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address uint16_t addr; if (!ScanHex(riga.mid(pos, 4), addr)) { rval = BADFILETYPE; break; } else { pos += 4; } checksum += (uint8_t)(addr >> 8); checksum += (uint8_t)addr; laddr = (uint32_t)addr << 4; } } else if (rectype == LIN_ADDR_RECORD) { if (bcount != 2) { rval = BADFILETYPE; break; } else { //Address uint16_t addr; if (!ScanHex(riga.mid(pos, 4), addr)) { rval = BADFILETYPE; break; } else { pos += 4; } checksum += (uint8_t)(addr >> 8); checksum += (uint8_t)addr; laddr = (uint32_t)addr << 16; } } /** just ignored else if (rectype == START_RECORD) { if (bcount != 4) { rval = BADFILETYPE; break; } // Lo possiamo ignorare, dovrebbe // essere il linker a mettere tutto // a posto. Noi non fungiamo da loader! //jmpaddr = ScanHex(&s, 8); // ScanHex(&s, 8); while (bcount--) { data = (uint8_t)ScanHex(&s, 2); checksum += data; } } **/ else // Unknown record type: discard data bytes (but check for validity) { bool ok = true; while (bcount-- && ok) { if (!ScanHex(riga.mid(pos, 2), data)) { ok = false; } else { pos += 2; } checksum += (uint8_t)data; } if (!ok) { rval = BADFILETYPE; break; } } if (!ScanHex(riga.mid(pos, 2), data)) { rval = BADFILETYPE; break; } else { pos += 2; } if ((uint8_t)data != (uint8_t)(~checksum + 1)) { rval = BADFILETYPE; break; } else { okline_counter++; } if (rectype == END_RECORD) { break; } } fh.close(); if (okline_counter == 0) { rval = BADFILETYPE; } else { if (img_size == 0) //nessun dato ma il formato e` corretto { img_size++; } } //In questi formati di file "stupidi" la dimensione //deve rimanere quella della eeprom attualmente selezionata if (rval == OK) { // SetStringID(""); //???? SetComment(""); SetRollOver(0); //2 (che significa NO) ?? // SetCRC( mcalc_crc(GetBufPtr(), img_size) ); rval = img_size; } return rval; } /*Passandogli un indirizzo di stringa, converte le prime cifre di tale * stringa in Hesadecimali, incrementa il puntatore, e restituisce il numero. * Attenzione! Poiche` il numero restituito e` uint32_t (4Byte), il numero max * di e` 8 (8 cifre esadecimali 0xABCDEF12). */ bool IntelFileBuf::ScanHex(const QString &sp, uint32_t &result) { bool ok; result = sp.toInt(&ok, 16); return ok; #if 0 char cifra[20]; int j; if (len > 8) { return -2; } for (j = 0; j < len && **sp; j++) { cifra[j] = *(*sp)++; if (!isxdigit(cifra[j])) { return -1; } } cifra[j] = '\0'; result = strtoul(cifra, NULL, 16); #endif return 0; } bool IntelFileBuf::ScanHex(const QString &sp, uint16_t &result) { bool ok; result = sp.toInt(&ok, 16); return ok; #if 0 uint32_t res; int rval = ScanHex(sp, len, res); result = (uint16_t)res; return rval; #endif } tmp9balx013/SrcPony/at93cxx8.cpp0000644000175000017500000000752313616566001016431 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at93cxx8.h" // Header file #include "errcode.h" #include "eeptypes.h" #include At93cxx8::At93cxx8(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { qDebug() << "At93cxx8::At93cxx8()"; } At93cxx8::~At93cxx8() { qDebug() << "At93cxx8::~At93cxx8()"; } // determina il numero di banchi (dimensione) dell'eeprom int At93cxx8::Probe(int probe_size) { qDebug() << "At93cxx8::Probe()"; return OK; } int At93cxx8::Read(int probe, int type) { qDebug() << "At93cxx8::Read(" << probe << ")"; GetBus()->SetOrganization(ORG8); if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Read(asize, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "At93cxx8::Read() = " << rv; return rv; } int At93cxx8::Write(int probe, int type) { GetBus()->SetOrganization(ORG8); if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Write(asize, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int At93cxx8::Verify(int type) { GetBus()->SetOrganization(ORG8); if (GetNoOfBank() == 0) { return BADPARAM; } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); unsigned char *localbuf; localbuf = new unsigned char[size]; int rval = 1; if (type & PROG_TYPE) { rval = GetBus()->Read(asize, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } } delete[] localbuf; return rval; } tmp9balx013/SrcPony/interfconv.cpp0000644000175000017500000001350213616566001017205 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include "types.h" #include "globals.h" #include "interfconv.h" struct Interf2Index { int vector; int index; QString name; HInterfaceType type; VidPid vp; InterfPins pins; int port; }; //RaspberryPi default pins #define DEF_GPIO_CTRL 23 //Rst pin 16 #define DEF_GPIO_DATAIN 27 //Miso pin 13 #define DEF_GPIO_DATAOUT 17 //Mosi pin 11 #define DEF_GPIO_CLOCK 24 //Clock pin 18 #define DEF_MPSSE_CTRL 9 //ACBUS1 #define DEF_MPSSE_DATAIN 2 //ADBUS2 #define DEF_MPSSE_DATAOUT 1 //ADBUS1 #define DEF_MPSSE_CLOCK 0 //ADBUS0 static QVector index_interface = { //Interfaces vector {INTERF_COM, 0, "SI-ProgAPI", SIPROG_API}, {INTERF_COM, 1, "SI-ProgI/O", SIPROG_IO}, {INTERF_COM, 2, "JDM-API", JDM_API}, {INTERF_LPT, 0, "AvrISP-API", AVRISP}, {INTERF_LPT, 1, "AvrISP-I/O", AVRISP_IO}, {INTERF_LPT, 2, "DT-006-API", DT006_API}, {INTERF_LPT, 3, "DT-006-I/O", DT006_IO}, {INTERF_LPT, 4, "EasyI2C-API", EASYI2C_API}, {INTERF_LPT, 5, "EasyI2C-I/O", EASYI2C_IO}, {INTERF_USB, 0, "FTDI PonyProgFT", PONYPROG_FT, VidPid(0x0403, 0x6e38), {3, 2, 1, 0, /* 4 */ -1, 5, 7, 6}, FTDI_PORTA}, {INTERF_USB, 1, "FTDI JtagKey", FTDI_JTAGKEY, VidPid(0x0403, 0xcff8), {9, 2, 1, 0, -1, -1, -1, -1}, FTDI_PORTA}, {INTERF_GPIO, 0, "Linux SysFs GPIO", LINUXSYSFS_IO, VidPid(), {23, 27, 17, 24, -1, -1, -1, -1}}, //{INTERF_GPIO, 1, "PonyProgRPi", PONYPROG_RPI}, }; int TypeToInterfPort(HInterfaceType type) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { return index_interface.at(k).port; } } return -1; } bool TypeToInterfPins(HInterfaceType type, InterfPins &pins) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { pins = index_interface.at(k).pins; return true; } } return false; } bool TypeToInterfVidPid(HInterfaceType type, unsigned int &vid, unsigned int &pid) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { vid = index_interface.at(k).vp.vid; pid = index_interface.at(k).vp.pid; return true; } } return false; } VidPid TypeToInterfVidPid(HInterfaceType type) { VidPid rv; for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { rv = index_interface.at(k).vp; break; } } return rv; } QStringList GetInterfList(int vector) { QStringList lst; for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).vector == vector) { lst << index_interface.at(k).name; } } return lst; } HInterfaceType NameToInterfType(const QString &name) { if (name.length()) { QString n = name; n.remove(QChar('-')); n.remove(QChar(' ')); n.remove(QChar('/')); for (int k = 0; k < index_interface.count(); k++) { QString v = index_interface.at(k).name; v.remove(QChar('-')); v.remove(QChar(' ')); v.remove(QChar('/')); if (v.indexOf(n) >= 0) { return index_interface.at(k).type; } } } return LAST_HT; } QString TypeToInterfName(HInterfaceType type) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { return index_interface.at(k).name; } } return ""; } int TypeToInterfVector(HInterfaceType type) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { return index_interface.at(k).vector; } } return -1; } int TypeToInterfIndex(HInterfaceType type) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).type == type) { return index_interface.at(k).index; } } return -1; } HInterfaceType VindexToInterfType(int vector, int index) { for (int k = 0; k < index_interface.count(); k++) { if (index_interface.at(k).vector == vector && index_interface.at(k).index == index) { return index_interface.at(k).type; } } return LAST_HT; } tmp9balx013/SrcPony/aboutmdlg.h0000644000175000017500000000463713616566001016464 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef aboutMDLG_H #define aboutMDLG_H #include "ui_aboutdlg.h" #include #include #include #include "e2cmdw.h" class e2CmdWindow; class AboutModalDialog : public QDialog, public cTranslator, public Ui::AboutDialog { Q_OBJECT public: AboutModalDialog(QWidget *bw = 0, const QString title = "About"); virtual ~AboutModalDialog(); // Destructor protected: private slots: void onChkStart(bool); void onHelp(); private: e2CmdWindow *cmdw; }; #endif tmp9balx013/SrcPony/intfbuf.h0000644000175000017500000000511413616566001016132 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _INTELFBUF_H #define _INTELFBUF_H #include #include "types.h" #include "filebuf.h" #include "device.h" class IntelFileBuf : public FileBuf { public: IntelFileBuf(e2AppWinInfo *wininfo = 0); virtual ~IntelFileBuf(); virtual int Load(int loadtype = ALL_TYPE, long relocation_offset = 0); virtual int Save(int savetype = ALL_TYPE, long relocation_offset = 0); protected: private: int WriteRecord(QFile &fh, uint8_t *bptr, long curaddr, long recsize, int fmt); int WriteAddressRecord(QFile &fh, long curaddr, bool linear_address = false); bool ScanHex(const QString &s, uint32_t &result); bool ScanHex(const QString &s, uint16_t &result); }; #endif tmp9balx013/SrcPony/e24xx-5.cpp0000644000175000017500000000672113616566001016151 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include "types.h" #include "e2awinfo.h" #include "e24xx-5.h" // Header file #include "errcode.h" #include "eeptypes.h" E24xx5::E24xx5(e2AppWinInfo *wininfo, BusIO *busp) : E24xx(wininfo, busp, 128) { // writepage_size = E2Profile::GetI2CPageWrite(); // E2Profile::SetI2CPageWrite(writepage_size); writepage_size = 32; base_addr = 0x00; // 24C325 or 24C645 use non standard I2C Bus address, Probe() will try ALL possible I2C Adresses from 0x00 to 0xFE } E24xx5::~E24xx5() { } int E24xx5::Write(int probe, int type) { E24xx5::Probe(0); if (type & PROG_TYPE) { //Enable writing uint8_t buffer[4]; buffer[0] = 0xFF; //last address (Write protect register) buffer[1] = 0x02; //set WEL bit if (GetBus()->StartWrite(eeprom_addr[n_bank - 1], buffer, 2) != 2) { return GetBus()->Error(); } buffer[0] = 0xFF; //last address (Write protect register) buffer[1] = 0x06; //set RWEL+WEL bit if (GetBus()->StartWrite(eeprom_addr[n_bank - 1], buffer, 2) != 2) { return GetBus()->Error(); } buffer[0] = 0xFF; //last address (Write protect register) buffer[1] = 0x02; //reset WPEN, BP1, BP0 (disable any write protection) if (GetBus()->Write(eeprom_addr[n_bank - 1], buffer, 2) != 2) { return GetBus()->Error(); } //Ack polling int k; for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[0], buffer, 1) != 1; k--) { qApp->processEvents(); } if (k == 0) { return E2P_TIMEOUT; } } return E24xx::Write(probe); } tmp9balx013/SrcPony/sdebus.cpp0000644000175000017500000001237313616566001016322 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "sdebus.h" #include "errcode.h" #include #include #include "e2cmdw.h" Sde2506Bus::Sde2506Bus(BusInterface *ptr) : BusIO(ptr) { qDebug() << Q_FUNC_INFO; } Sde2506Bus::~Sde2506Bus() { qDebug() << Q_FUNC_INFO; } void Sde2506Bus::SetDelay() { int val = E2Profile::GetSDESpeed(); int n; switch (val) { case TURBO: n = 1; break; case FAST: n = 5; break; case SLOW: n = 30; break; case VERYSLOW: n = 100; break; case ULTRASLOW: n = 1000; break; default: n = 10; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } int Sde2506Bus::SendDataBit(int b) { //clearCLK(); //si assicura che SCK low //ShotDelay(); //setCLK(); //bitDI(b); //ShotDelay(); //clearCLK(); //device latch data bit now! int err = OK; clearCLK(); busI->xferBit(err, b, SPI_MODE_1 | xMODE_WRONLY); return err; } int Sde2506Bus::RecDataBit() { //clearCLK(); //the eeprom set data now //ShotDelay(); //setCLK(); //b = getDO(); //ShotDelay(); //hold time //clearCLK(); int err = OK; clearCLK(); int rv = busI->xferBit(err, 1, SPI_MODE_0 | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int Sde2506Bus::SendDataWord(int wo, int wlen) { int err = OK; clearCLK(); ShotDelay(); busI->xferWord(err, wo, SPI_MODE_1 | xMODE_WRONLY, wlen, true); setDI(); return err; } int Sde2506Bus::RecDataWord(int wlen) { int err = OK; clearCLK(); int rv = busI->xferWord(err, 0xffff, SPI_MODE_0 | xMODE_RDONLY, wlen, true); if (err == OK) { return rv; } else { return err; } } int Sde2506Bus::WaitReadyAfterWrite(long timeout) { WaitMsec(15); return OK; } int Sde2506Bus::Reset(void) { qDebug() << Q_FUNC_INFO; SetDelay(); clearCLK(); //clock = 0 setDI(); //data = 1 setCE(); //CE = 1 return OK; } long Sde2506Bus::Read(int addr, uint8_t *data, long length, int page_size) { qDebug() << Q_FUNC_INFO << "(" << (hex) << addr << ", " << data << ", " << (dec) << length << ")"; ReadStart(); long len; for (len = 0; len < length; len++) { setCE(); //Send command opcode SendAddress(addr++); SendControlBit(0); //SB = 0 --> Read op WaitUsec(5); clearCE(); ShotDelay(); SendDataBit(1); *data++ = RecDataWord(); ShotDelay(2); setCE(); if ((len % 4) == 0) { if (ReadProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush ReadEnd(); qDebug() << Q_FUNC_INFO << "=" << len; return len; } long Sde2506Bus::Write(int addr, uint8_t const *data, long length, int page_size) { long curaddr; WriteStart(); for (curaddr = addr; curaddr < length; curaddr++) { setCE(); //Send command opcode SendDataWord(*data++); SendAddress(curaddr); SendControlBit(1); //SB = 1 --> Write/Erase op ShotDelay(2); //WaitUsec(5); clearCE(); SendDataBit(1); //Start erase setDI(); WaitReadyAfterWrite(); setCE(); //End erase ShotDelay(); //WaitUsec(GetDelay() / 2 + 1); //perform write clearDI(); ShotDelay(); clearCE(); SendDataBit(0); //Start write setDI(); WaitReadyAfterWrite(); setCE(); //End write ShotDelay(); if ((curaddr & 1)) { if (WriteProgress(curaddr * 100 / length)) { break; } } } WaitMsec(1); //Flush WriteEnd(); return curaddr; } tmp9balx013/SrcPony/e2profil.cpp0000644000175000017500000010273413616566001016560 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include #include #include "version.h" #include "e2profil.h" #include "types.h" #include "errcode.h" #include "globals.h" #include "portint.h" #ifdef Q_OS_WIN32 QSettings *E2Profile::s = new QSettings(QSettings::IniFormat, QSettings::UserScope, "LancOS", APP_NAME); #else QSettings *E2Profile::s = new QSettings(APP_NAME); #endif int E2Profile::GetBogoMips() { return s->value("BogoMipsX1000", 0).toInt(); } void E2Profile::SetBogoMips(int value) { s->setValue("BogoMipsX1000", value); } #include "eeptypes.h" long E2Profile::GetLastDevType() { QString vrs = s->value("PonyProgVers", "pre").toString(); QString sp = s->value("DeviceType", "24XX Auto").toString(); if (vrs == "pre") // init for old configurations { sp = "24XX Auto"; } if (sp.length()) { return GetEEPTypeFromString(sp); } else { return E2400; //Default device type } } void E2Profile::SetLastDevType(long devtype) { QString sp = GetEEPTypeString(devtype); s->setValue("PonyProgVers", APP_VERSION); if (sp.length()) { s->setValue("DeviceType", sp.remove(QChar(' '))); } } HInterfaceType E2Profile::GetParInterfType() { QString sp = s->value("InterfaceType", TypeToInterfName(SIPROG_API)).toString(); return NameToInterfType(sp); } void E2Profile::SetParInterfType(HInterfaceType type) { s->setValue("InterfaceType", TypeToInterfName(type)); } int E2Profile::GetPortNumber() { return s->value("PortNumber", -1).toInt(); } void E2Profile::SetPortNumber(int port) { if (port >= 0 /* && port < 4 */) { s->setValue("PortNumber", port); } } //Check if the entry is already in the list, in this case remove //then insert the entry in the head of the list void E2Profile::SetLastScript(const QString &name) { //Save complete file path QString fname = QFileInfo(name).canonicalFilePath(); if (fname.length() > 0) { QStringList l = GetLastScripts(); //Check if already in the list int idx = l.indexOf(fname); if (idx != 0) { l.insert(0, fname); l.removeDuplicates(); SetLastScripts(l); } } } //Check if the entry is already in the list, in this case remove //then insert the entry in the head of the list void E2Profile::SetLastFile(const QString &name, int data_type) { //Save complete file path QString fname = QFileInfo(name).canonicalFilePath(); if (fname.length() > 0) { QStringList l = GetLastFiles(); QString item_name = fname; if (data_type == PROG_TYPE) { item_name += "?PROG"; } else if (data_type == DATA_TYPE) { item_name += "?DATA"; } else { item_name += "?ALL"; } //int pos = l.indexOf(item_name); l.insert(0, item_name); l.removeDuplicates(); SetLastFiles(l); } } QString E2Profile::GetLastFile(int &data, int index) { QString sp = ""; if (index < 0 || index >= GetLastFiles().count()) { return sp; } sp = GetLastFiles().at(index); data = ALL_TYPE; if (sp.length()) { int p = sp.indexOf('?'); if (p >= 0) { if (sp.mid(p + 1) == "DATA") { data = DATA_TYPE; } else if (sp.mid(p + 1) == "PROG") { data = PROG_TYPE; } sp = sp.left(p); } } return sp; } QStringList E2Profile::GetLastFiles() { QStringList res; for (int i = 0; i < 8; i++) { QString sp = s->value(QString().sprintf("LastFile%d", i), "").toString(); if (sp.length() == 0) { break; } res << sp; } return res; } void E2Profile::SetLastFiles(const QStringList &l) { int i = 0; foreach (QString t, l) { s->setValue(QString().sprintf("LastFile%d", i), t); i++; } // for (; i < 8; i++) // { // s->setValue(QString().sprintf("LastFile%d", i), ""); // } } QStringList E2Profile::GetLastScripts() { QStringList res; for (int i = 0; i < 8; i++) { QString sp = s->value(QString().sprintf("LastScript%d", i), "").toString(); res << sp; } return res; } void E2Profile::SetLastScripts(const QStringList &l) { int i = 0; foreach (QString t, l) { s->setValue(QString().sprintf("LastScript%d", i), t); i++; } for (; i < 8; i++) { s->setValue(QString().sprintf("LastFile%d", i), ""); } } unsigned int E2Profile::GetPolarityLines() { return s->value("PolarityLines", 0).toUInt(); } void E2Profile::SetPolarityLines(unsigned int polarity) { s->setValue("PolarityLines", polarity); } int E2Profile::GetI2CPageWrite() { return s->value("I2CBusPageWrite", 16).toInt(); } void E2Profile::SetI2CPageWrite(int page_write) { if (page_write > 0) { s->setValue("I2CBusPageWrite", page_write); } } int E2Profile::GetSPIPageWrite() { return s->value("BigSPIPageWrite", 16).toInt(); } void E2Profile::SetSPIPageWrite(int page_write) { if (page_write > 0) { s->setValue("BigSPIPageWrite", page_write); } } int E2Profile::GetI2CBaseAddr() { QString sp = s->value("I2CBaseAddress", "0xA0").toString(); int rval = 0xA0; //Default base address if (sp.length()) { bool ok; rval = sp.toLong(&ok, 0); if (!ok) { rval = 0xA0; } } return rval; } void E2Profile::SetI2CBaseAddr(int base_addr) { if (base_addr >= 0x00 && base_addr < 0x100) { s->setValue("I2CBaseAddress", QString().sprintf("0x%X", base_addr)); } } int E2Profile::GetSPIResetPulse() { //Default: 100 msec return s->value("SPIResetPulse", 100).toInt(); } void E2Profile::SetSPIResetPulse(int delay) { if (delay > 0) { s->setValue("SPIResetPulse", delay); } } int E2Profile::GetSPIDelayAfterReset() { //Default: 50 msec return s->value("SPIDelayAfterReset", 50).toInt(); } void E2Profile::SetSPIDelayAfterReset(int delay) { if (delay > 0) { s->setValue("SPIDelayAfterReset", delay); } } int E2Profile::GetAT89DelayAfterReset() { //Default: 50 msec return s->value("AT89DelayAfterReset", 50).toInt(); } void E2Profile::SetAT89DelayAfterReset(int delay) { if (delay > 0) { s->setValue("AT89DelayAfterReset", delay); } } int E2Profile::GetAVRDelayAfterReset() { //Default: 50 msec return s->value("AVRDelayAfterReset", 50).toInt(); } void E2Profile::SetAVRDelayAfterReset(int delay) { if (delay > 0) { s->setValue("AVRDelayAfterReset", delay); } } QString E2Profile::getSpeedName(int speed) { if (speed == TURBO) { return QString("TURBO"); } else if (speed == FAST) { return QString("FAST"); } else if (speed == SLOW) { return QString("SLOW"); } else if (speed == VERYSLOW) { return QString("VERYSLOW"); } else if (speed == ULTRASLOW) { return QString("ULTRASLOW"); } else //if (speed == NORMAL) { return QString("NORMAL"); } } int E2Profile::getSpeedIndex(const QString &sp) { int rval = NORMAL; //Default speed if (sp.length()) { if (sp == "TURBO") { rval = TURBO; } else if (sp == "FAST") { rval = FAST; } else if (sp == "SLOW") { rval = SLOW; } else if (sp == "VERYSLOW") { rval = VERYSLOW; } else if (sp == "ULTRASLOW") { rval = ULTRASLOW; } } return rval; } int E2Profile::GetI2CSpeed() { QString sp = s->value("BusSpeed/I2CBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetI2CSpeed(int speed) { s->setValue("BusSpeed/I2CBusSpeed", getSpeedName(speed)); } int E2Profile::GetSPISpeed() { QString sp = s->value("BusSpeed/SPIBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetSPISpeed(int speed) { s->setValue("BusSpeed/SPIBusSpeed", getSpeedName(speed)); } int E2Profile::GetMicroWireSpeed() { QString sp = s->value("BusSpeed/MicroWireBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetMicroWireSpeed(int speed) { s->setValue("BusSpeed/MicroWireBusSpeed", getSpeedName(speed)); } int E2Profile::GetPICSpeed() { QString sp = s->value("BusSpeed/PICBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetPICSpeed(int speed) { s->setValue("BusSpeed/PICBusSpeed", getSpeedName(speed)); } int E2Profile::GetSDESpeed() { QString sp = s->value("BusSpeed/SDEBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetSDESpeed(int speed) { s->setValue("BusSpeed/SDEBusSpeed", getSpeedName(speed)); } int E2Profile::GetIMBusSpeed() { QString sp = s->value("BusSpeed/IMBusSpeed", getSpeedName(NORMAL)).toString(); return getSpeedIndex(sp); } void E2Profile::SetIMBusSpeed(int speed) { s->setValue("BusSpeed/IMBusSpeed", getSpeedName(speed)); } void E2Profile::GetPrinterSettings(QPrinter &p) { s->beginGroup("Printer"); p.setPrinterName(s->value("PrinterName").toString()); p.setPageSize(QPrinter::PaperSize(s->value("PageSize", QPrinter::A4).toInt())); p.setCollateCopies(s->value("Copies", false).toBool()); p.setColorMode(QPrinter::ColorMode(s->value("ColorMode").toInt())); p.setCopyCount(s->value("CopyCount", 1).toInt()); p.setCreator(s->value("Creator", "").toString()); p.setDocName(s->value("DocName", "ponyprog.pdf").toString()); p.setDoubleSidedPrinting(s->value("DoubleSide", false).toBool()); p.setDuplex(QPrinter::DuplexMode(s->value("Duplex").toInt())); p.setFontEmbeddingEnabled(s->value("FontEmb", false).toBool()); p.setFullPage(s->value("FullPage", false).toBool()); p.setOrientation(QPrinter::Orientation(s->value("Orientation", QPrinter::Portrait).toInt())); p.setOutputFileName(s->value("OutputName", "").toString()); p.setOutputFormat(QPrinter::OutputFormat(s->value("OutputFormat", QPrinter::PdfFormat).toInt())); p.setPageOrder(QPrinter::PageOrder(s->value("PageOrder").toInt())); p.setPaperSize(QPrinter::PaperSize(s->value("PaperSize").toInt())); p.setPaperSource(QPrinter::PaperSource(s->value("PaperSource").toInt())); p.setPrintProgram(s->value("PrintProg", "").toString()); p.setPrintRange(QPrinter::PrintRange(s->value("PrintRange").toInt())); p.setResolution(s->value("Resolution", 96).toInt()); qreal left, top, right, bottom; left = (s->value("LeftMargin", 15).toFloat()); top = (s->value("TopMargin", 15).toFloat()); right = (s->value("RightMargin", 15).toFloat()); bottom = (s->value("BottomMargin", 15).toFloat()); p.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); s->endGroup(); } void E2Profile::SetPrinterSettings(QPrinter &p) { s->beginGroup("Printer"); s->setValue("PrinterName", p.printerName()); s->setValue("PageSize", p.pageSize()); s->setValue("Copies", p.collateCopies()); s->setValue("ColorMode", p.colorMode()); s->setValue("CopyCount", p.copyCount()); s->setValue("Creator", p.creator()); s->setValue("DocName", p.docName()); s->setValue("DoubleSide", p.doubleSidedPrinting()); s->setValue("Duplex", p.duplex()); s->setValue("FontEmb", p.fontEmbeddingEnabled()); s->setValue("FullPage", p.fullPage()); s->setValue("Orientation", p.orientation()); s->setValue("OutputName", p.outputFileName()); s->setValue("OutputFormat", p.outputFormat()); s->setValue("PageOrder", p.pageOrder()); s->setValue("PaperSize", p.paperSize()); s->setValue("PaperSource", p.paperSource()); s->setValue("PrintProg", p.printProgram()); s->setValue("PrintRange", p.printRange()); s->setValue("Resolution", p.resolution()); qreal left, top, right, bottom; p.getPageMargins(&left, &top, &right, &bottom, QPrinter::Millimeter); s->setValue("LeftMargin", left); s->setValue("TopMargin", top); s->setValue("BottomMargin", bottom); s->setValue("RightMargin", right); s->endGroup(); } int E2Profile::GetMegaPageDelay() { //Default: 50 msec return s->value("ATMegaPageWriteDelay", 50).toInt(); } void E2Profile::SetMegaPageDelay(int delay) { if (delay > 0) { s->setValue("ATMegaPageWriteDelay", delay); } } int E2Profile::GetPowerUpDelay() { //Default: 200 msec return s->value("PowerUpDelay", 200).toInt(); } void E2Profile::SetPowerUpDelay(int delay) { if (delay > 0) { s->setValue("PowerUpDelay", delay); } } int E2Profile::GetAVRProgDelay() { //Default: 20 msec return s->value("AVRByteWriteDelay", 20).toInt(); } void E2Profile::SetAVRProgDelay(int delay) { if (delay > 0) { s->setValue("AVRByteWriteDelay", delay); } } int E2Profile::GetFontSize() { return s->value("FontSize", 9).toInt(); } void E2Profile::SetFontSize(int sz) { if (sz > 0) { s->setValue("FontSize", sz); } } int E2Profile::GetAVREraseDelay() { //Default: 50 msec return s->value("AVREraseDelay", 50).toInt(); } void E2Profile::SetAVREraseDelay(int delay) { if (delay > 0) { s->setValue("AVREraseDelay", delay); } } int E2Profile::GetMDAProgDelay() { //Default: 30 msec return s->value("MDAWriteDelay", 30).toInt(); } void E2Profile::SetMDAProgDelay(int delay) { if (delay >= 0) { s->setValue("MDAWriteDelay", delay); } } int E2Profile::GetNVMProgDelay() { //Default: 30 msec return s->value("NVMWriteDelay", 30).toInt(); } void E2Profile::SetNVMProgDelay(int delay) { if (delay >= 0) { s->setValue("NVMWriteDelay", delay); } } unsigned long E2Profile::GetSerialNumVal() { QString sp = s->value("SerialNumber/Value", "0").toString(); unsigned long rval = 0; //Default 0 if (sp.length()) { bool ok; rval = sp.toULong(&ok); if (!ok) { rval = 0; } } return rval; } void E2Profile::SetSerialNumVal(unsigned long val) { s->setValue("SerialNumber/Value", QString::number(val)); } int E2Profile::GetSerialNumAddress(long &start, int &size, bool &mtype) { QString sp; bool ok; start = 0; s->beginGroup("SerialNumber"); sp = s->value("Address", "0").toString(); if (sp.length()) { start = sp.toLong(&ok, 0); if (!ok) { start = 0; } } size = s->value("Size", 1).toInt(&ok); if (!ok) { size = 1; } mtype = false; sp = s->value("Type", "PROG").toString(); if (sp.length() && sp == "DATA") { mtype = true; } s->endGroup(); return OK; } void E2Profile::SetSerialNumAddress(unsigned long start, int size, bool mtype) { s->beginGroup("SerialNumber"); s->setValue("Address", QString().sprintf("0x%04lX", start)); if (size >= 1) { s->setValue("Size", size); } s->setValue("Type", mtype ? "DATA" : "PROG"); s->endGroup(); } FmtEndian E2Profile::GetSerialNumFormat() { QString sp = s->value("SerialNumber/Format", "BIGENDIAN").toString(); if (sp.length() && ("LITTLEENDIAN" == sp)) { return FMT_LITTLE_ENDIAN; } else { return FMT_BIG_ENDIAN; } } void E2Profile::SetSerialNumFormat(FmtEndian fmt) { s->setValue("SerialNumber/Format", (fmt == FMT_BIG_ENDIAN) ? "BIGENDIAN" : "LITTLEENDIAN"); } bool E2Profile::GetSerialNumAutoInc() { return s->value("SerialNumber/AutoIncrement", true).toBool(); } void E2Profile::SetSerialNumAutoInc(bool val) { s->setValue("SerialNumber/AutoIncrement", val); } long E2Profile::GetProgramOptions() { long res = 0; QString rval; s->beginGroup("ProgramOptions"); rval = s->value("ReloadOption", "").toString(); if (rval.length() && rval != "NO") { res |= RELOAD_YES; } rval = s->value("ReadFlashOption", "").toString(); if (rval.length() && rval != "NO") { res |= READFLASH_YES; } rval = s->value("ReadEEpromOption", "").toString(); if (rval.length() && rval != "NO") { res |= READEEP_YES; } rval = s->value("ByteSwapOption", "").toString(); if (rval.length() && rval != "NO") { res |= BYTESWAP_YES; } rval = s->value("SetIDkeyOption", "").toString(); if (rval.length() && rval != "NO") { res |= SETID_YES; } rval = s->value("ReadOscCalibration", "").toString(); if (rval.length() && rval != "NO") { res |= READOSCAL_YES; } rval = s->value("EraseOption", "").toString(); if (rval.length() && rval != "NO") { res |= ERASE_YES; } rval = s->value("WriteFlashOption", "").toString(); if (rval.length() && rval != "NO") { res |= FLASH_YES; } rval = s->value("WriteEEpromOption", "").toString(); if (rval.length() && rval != "NO") { res |= EEPROM_YES; } rval = s->value("WriteSecurityOption", "").toString(); if (rval.length() && rval != "NO") { res |= LOCK_YES; } s->endGroup(); return res; } void E2Profile::SetProgramOptions(long prog_option) { s->beginGroup("ProgramOptions"); s->setValue("ReloadOption", (prog_option & RELOAD_YES) ? "YES" : "NO"); s->setValue("ReadFlashOption", (prog_option & READFLASH_YES) ? "YES" : "NO"); s->setValue("ReadEEpromOption", (prog_option & READEEP_YES) ? "YES" : "NO"); s->setValue("ByteSwapOption", (prog_option & BYTESWAP_YES) ? "YES" : "NO"); s->setValue("SetIDkeyOption", (prog_option & SETID_YES) ? "YES" : "NO"); s->setValue("ReadOscCalibration", (prog_option & READOSCAL_YES) ? "YES" : "NO"); s->setValue("EraseOption", (prog_option & ERASE_YES) ? "YES" : "NO"); s->setValue("WriteFlashOption", (prog_option & FLASH_YES) ? "YES" : "NO"); s->setValue("WriteEEpromOption", (prog_option & EEPROM_YES) ? "YES" : "NO"); s->setValue("WriteSecurityOption", (prog_option & LOCK_YES) ? "YES" : "NO"); s->endGroup(); } QString E2Profile::GetLangDir() { return s->value("LangDir", "").toString(); } void E2Profile::SetLangDir(const QString &name) { if (name.length()) { s->setValue("LangDir", name); } } QString E2Profile::GetCurrentLang() { return s->value("CurrentLang", "english").toString(); } void E2Profile::SetCurrentLang(const QString &name) { if (name.length()) { s->setValue("CurrentLang", name); } } QString E2Profile::GetLogFileName() { QString sp = s->value("LogFileName", "PonyProg.log").toString(); return sp; } void E2Profile::SetLogFileName(const QString &name) { if (name.length()) { s->setValue("LogFileName", name); } } #if 0 QString E2Profile::GetLockDir() { QString sp = s->value("ttyLockDir", "/var/lock").toString(); return sp; } void E2Profile::SetLockDir(const QString &name) { if (name.length()) { s->setValue("ttyLockDir", name); } } QString E2Profile::GetDevDir() { QString sp = s->value("ttyDevDir", "/dev").toString(); return sp; } void E2Profile::SetDevDir(const QString &name) { if (name.length()) { s->setValue("ttyDevDir", name); } } #endif #ifdef Q_OS_LINUX static QString retrieve_ttyS_name() { QString sp = "COM"; QFile file("/proc/tty/drivers"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString line = in.readLine(); while (!line.isNull()) { line = line.simplified(); if (line.size() > 0) { QStringList l = line.split(" "); if (l.count() > 1 && l.at(0) == "serial") { sp = l.at(1); break; } } line = in.readLine(); } file.close(); } else { qWarning() << "Can't open file /proc/tty/drivers"; } return sp; } static QStringList retrieve_ttyS_list() { QStringList lst; QString name = retrieve_ttyS_name(); if (name.length() == 0) { return lst; } QFile file("/proc/tty/driver/serial"); //Need Root access!!!! if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString line = in.readLine(); while (!line.isNull()) { if (line.contains("tx:")) { QStringList l = line.split(":"); if (l.count() > 0) { bool ok = false; l.at(0).toInt(&ok); if (ok) { lst << name + l.at(0); qDebug() << "ttyS dev: " << name << l.at(0); } } } line = in.readLine(); } file.close(); } else { qWarning() << "Can't open file /proc/tty/driver/serial"; } return lst; } #endif QString E2Profile::GetCOMDevName() { QString sp = s->value("LegacyPorts/COMDevName", "").toString(); if (sp.length() == 0) { #ifdef Q_OS_LINUX sp = retrieve_ttyS_name(); #else sp = "COM"; #endif } return sp; } void E2Profile::SetCOMDevName(const QString &name) { if (name.length()) { s->setValue("LegacyPorts/COMDevName", name); } } QStringList E2Profile::GetCOMDevList() { QStringList lst = s->value("LegacyPorts/COMDevList", QStringList()).toStringList(); if (lst.count() == 0) { #ifdef Q_OS_LINUX lst = retrieve_ttyS_list(); if (lst.count() == 0) { QString sname = E2Profile::GetCOMDevName(); for (int i = 0; i < MAX_COMPORTS; i++) { lst << sname + QString::number(i); } } else { E2Profile::SetCOMDevList(lst); } #else QString sname = E2Profile::GetCOMDevName(); for (int i = 1; i <= MAX_COMPORTS; i++) { lst << sname + QString::number(i); } #endif } return lst; } void E2Profile::SetCOMDevList(const QStringList &lst) { s->setValue("LegacyPorts/COMDevList", lst); } QString E2Profile::GetLPTDevName() { QString sp = s->value("LegacyPorts/LPTDevName", "").toString(); if (sp.length() == 0) { #ifdef Q_OS_LINUX sp = QString("/dev/parport"); #else sp = QString("LPT"); #endif } return sp; } void E2Profile::SetLPTDevName(const QString &name) { if (name.length()) { s->setValue("LegacyPorts/LPTDevName", name); } } QStringList E2Profile::GetLPTDevList() { QStringList lst = s->value("LegacyPorts/LPTDevList", QStringList()).toStringList(); if (lst.count() == 0) { QString sname = E2Profile::GetLPTDevName(); #ifdef Q_OS_LINUX for (int i = 0; i < MAX_LPTPORTS; i++) #else for (int i = 1; i <= MAX_LPTPORTS; i++) #endif { lst << sname + QString::number(i); } } return lst; } void E2Profile::SetLPTDevList(const QStringList &lst) { s->setValue("LegacyPorts/LPTDevList", lst); } //QString E2Profile::GetHtmlBrowseApp() //{ // return s->value("HtmlBrowseApp", "konqueror").toString(); //} //void E2Profile::SetHtmlBrowseApp(const QString &name) //{ // if (name.length()) // { // s->setValue("HtmlBrowseApp", name); // } //} QString E2Profile::GetLanguageCode() { QString sp = s->value("LanguageCode", "C").toString(); if (sp.length() == 0) { sp = "C"; } return sp; } void E2Profile::SetLanguageCode(const QString &name) { if (name.length()) { s->setValue("LanguageCode", name); } } bool E2Profile::GetLogEnabled() { return s->value("LogEnabled", false).toBool(); } void E2Profile::SetLogEnabled(bool enabled) { s->setValue("LogEnabled", enabled); } bool E2Profile::GetSkipStartupDialog() { QString sp = s->value("Preferences/SkipStartupDialog", "NO").toString(); if (sp.length() && (sp == "YES")) { return true; } else { return false; } } void E2Profile::SetSkipStartupDialog(bool skip) { s->setValue("Preferences/SkipStartupDialog", skip ? "YES" : "NO"); } bool E2Profile::GetClearBufBeforeLoad() { QString sp = s->value("ClearBufferBeforeLoad", "NO").toString(); if (sp.length() && (sp == "YES")) { return true; } else { return false; } } void E2Profile::SetClearBufBeforeLoad(bool enabled) { s->setValue("ClearBufferBeforeLoad", enabled ? "YES" : "NO"); } bool E2Profile::GetClearBufBeforeRead() { QString sp = s->value("ClearBufferBeforeRead", "NO").toString(); if (sp.length() && (sp == "YES")) { return true; } else { return false; } } void E2Profile::SetClearBufBeforeRead(bool enabled) { s->setValue("ClearBufferBeforeRead", enabled ? "YES" : "NO"); } bool E2Profile::GetAt89PageOp() { QString sp = s->value("AT89SPageOpEnabled", "YES").toString(); if (sp.length() && (sp == "NO")) { return false; } else { return true; } } void E2Profile::SetAt89PageOp(bool enabled) { s->setValue("AT89SPageOpEnabled", enabled ? "YES" : "NO"); } bool E2Profile::Get8253FallEdge() { QString sp = s->value("AT89S8253FallEdgeSampling", "YES").toString(); if (sp.length() && (sp == "NO")) { return false; } else { return true; } } void E2Profile::Set8253FallEdge(bool enabled) { s->setValue("AT89S8253FallEdgeSampling", enabled ? "YES" : "NO"); } bool E2Profile::GetSoundEnabled() { QString sp = s->value("Preferences/SoundEnabled", "NO").toString(); if (sp.length() && (sp == "YES")) { return true; } else { return false; } } void E2Profile::SetSoundEnabled(bool enabled) { s->setValue("Preferences/SoundEnabled", enabled ? "YES" : "NO"); } int E2Profile::GetCalibrationAddress(bool &enabled, long &start, int &size, bool &mtype) { QString sp; bool ok; s->beginGroup("OscillatorCalibration"); enabled = s->value("Enabled", true).toBool(); start = 0; sp = s->value("StartAddress", "0").toString(); if (sp.length()) { start = sp.toLong(&ok, 0); if (!ok) { start = 0; } } size = s->value("Size", 1).toInt(&ok); if (!ok) { size = 1; } mtype = false; sp = s->value("MemoryType", "PROG").toString(); if (sp.length() && sp == "DATA") { mtype = true; } s->endGroup(); return OK; } void E2Profile::SetCalibrationAddress(bool enabled, unsigned long start, int size, bool mtype) { s->beginGroup("OscillatorCalibration"); s->setValue("Enabled", enabled); s->setValue("StartAddress", QString().sprintf("0x%04lX", start)); if (size >= 1) { s->setValue("Size", size); } s->setValue("MemoryType", mtype ? "DATA" : "PROG"); s->endGroup(); } unsigned int E2Profile::GetJDMCmd2CmdDelay() { //Default: 4000 usec return s->value("JDM-CmdToCmdDelay", 4000).toUInt(); } void E2Profile::SetJDMCmd2CmdDelay(unsigned int delay) { s->setValue("JDM-CmdToCmdDelay", delay); } bool E2Profile::GetVerifyAfterWrite() { return s->value("VerifyAfterWrite", true).toBool(); } void E2Profile::SetVerifyAfterWrite(bool enabled) { s->setValue("VerifyAfterWrite", enabled); } bool E2Profile::GetAutoDetectPorts() { return s->value("LegacyPorts/AutoDetectPorts", true).toBool(); } void E2Profile::SetAutoDetectPorts(bool enabled) { s->setValue("LegacyPorts/AutoDetectPorts", enabled); } int E2Profile::GetCOMAddress(unsigned int &com1, unsigned int &com2, unsigned int &com3, unsigned int &com4) { QString sp = s->value("LegacyPorts/COMPorts").toString(); com1 = 0x3F8; com2 = 0x2F8; com3 = 0x3E8; com4 = 0x2E8; if (sp.length()) { sscanf(sp.toLatin1().constData(), "%x,%x,%x,%x", &com1, &com2, &com3, &com4); } return OK; } void E2Profile::SetCOMAddress(unsigned int com1, unsigned int com2, unsigned int com3, unsigned int com4) { QString str; if (com1 > 0) { if (com2 > 0) { if (com3 > 0) { if (com4 > 0) { str.sprintf("%X,%X,%X,%X", com1, com2, com3, com4); } else { str.sprintf("%X,%X,%X", com1, com2, com3); } } else { str.sprintf("%X,%X", com1, com2); } } else { str.sprintf("%X", com1); } s->setValue("LegacyPorts/COMPorts", str); } } int E2Profile::GetLPTAddress(unsigned int &lpt1, unsigned int &lpt2, unsigned int &lpt3) { QString sp = s->value("LegacyPorts/LPTPorts").toString(); lpt1 = 0x378; lpt2 = 0x278; lpt3 = 0x3BC; if (sp.length()) { sscanf(sp.toLatin1().constData(), "%x,%x,%x", &lpt1, &lpt2, &lpt3); } return OK; } void E2Profile::SetLPTAddress(unsigned int lpt1, unsigned int lpt2, unsigned int lpt3) { QString str; if (lpt1 > 0) { if (lpt2 > 0) { if (lpt3 > 0) { str.sprintf("%X,%X,%X", lpt1, lpt2, lpt3); } else { str.sprintf("%X,%X", lpt1, lpt2); } } else { str.sprintf("%X", lpt1); } s->setValue("LegacyPorts/LPTPorts", str); } } FileType E2Profile::GetDefaultFileType() { QString sp = s->value("DefaultFileType", "E2P").toString(); FileType ft = E2P; if (sp.length()) { if (sp == "e2p") { ft = E2P; } else if (sp == "bin") { ft = BIN; } else if (sp == "csm") { ft = CSM; } else if (sp == "intel-hex") { ft = INTEL; } else if (sp == "mot-srec") { ft = MOTOS; } } return ft; } void E2Profile::SetDefaultFileType(FileType ft) { QString str; if (ft == E2P) { str = "E2P"; } else if (ft == BIN) { str = "BIN"; } else if (ft == CSM) { str = "CSM"; } else if (ft == INTEL) { str = "INTEL-HEX"; } else if (ft == MOTOS) { str = "MOT-SREC"; } if (str.length()) { s->setValue("DefaultFileType", str); } } bool E2Profile::GetEditBufferEnabled() { return !(s->value("Editor/ReadOnlyMode", false).toBool()); } void E2Profile::SetEditBufferEnabled(bool enable) { s->setValue("Editor/ReadOnlyMode", !enable); } void E2Profile::GetInterfacePins(HInterfaceType type, InterfPins &pins) { InterfPins dpins; //default pins if (!TypeToInterfPins(type, dpins)) { qWarning() << "TypeToInterfPins(" << type << ") Failed"; } s->beginGroup("InterfacePins-" + TypeToInterfName(type)); pins.clock = s->value("clockout", dpins.clock).toInt(); pins.clockin = s->value("clockin", dpins.clockin).toInt(); pins.ctrl = s->value("controlout", dpins.ctrl).toInt(); pins.ctrlin = s->value("controlin", dpins.ctrlin).toInt(); pins.datain = s->value("datain", dpins.datain).toInt(); pins.dataout = s->value("dataout", dpins.dataout).toInt(); pins.enbus = s->value("enbus", dpins.enbus).toInt(); pins.poweron = s->value("poweron", dpins.poweron).toInt(); s->endGroup(); } void E2Profile::SetInterfacePins(HInterfaceType type, const InterfPins &pins) { s->beginGroup("InterfacePins-" + TypeToInterfName(type)); if (pins.clock > -1) { s->setValue("clockout", pins.clock); } if (pins.clockin > -1) { s->setValue("clockin", pins.clockin); } if (pins.ctrl > -1) { s->setValue("controlout", pins.ctrl); } if (pins.ctrlin > -1) { s->setValue("controlin", pins.ctrlin); } if (pins.datain > -1) { s->setValue("datain", pins.datain); } if (pins.dataout > -1) { s->setValue("dataout", pins.dataout); } if (pins.enbus > -1) { s->setValue("enbus", pins.enbus); } if (pins.poweron > -1) { s->setValue("poweron", pins.poweron); } s->endGroup(); } int E2Profile::GetInterfacePort() { QString sp = s->value("InterfacePort", "A").toString(); int rv = FTDI_PORTA; if (sp.length() != 0) { if (sp.compare("B", Qt::CaseInsensitive) == 0 || sp.compare("1") == 0) { rv = FTDI_PORTB; } else if (sp.compare("C", Qt::CaseInsensitive) == 0 || sp.compare("2") == 0) { rv = FTDI_PORTC; } else if (sp.compare("D", Qt::CaseInsensitive) == 0 || sp.compare("3") == 0) { rv = FTDI_PORTD; } } return rv; } void E2Profile::SetInterfacePort(int port_index) { QString intname = QString::number(port_index); if (intname.length()) { s->setValue("InterfacePort", intname); } } void E2Profile::readDialogSettings(QWidget *window, bool recurse) { s->beginGroup(window->objectName()); //window->restoreGeometry(s->value("geometry").toByteArray()); if (s->value("maximized", false).toBool()) { window->showMaximized(); } else { QVariant value = s->value("pos"); if (!value.isNull()) { window->move(s->value("pos").toPoint()); window->resize(s->value("size").toSize()); } } if (recurse) { recurseRead(window); } s->endGroup(); } void E2Profile::writeDialogSettings(QWidget *window, bool recurse) { s->beginGroup(window->objectName()); //s->setValue("geometry", window->saveGeometry()); if (window->isMaximized()) { s->setValue("maximized", true); } else { s->setValue("maximized", false); s->setValue("pos", window->pos()); s->setValue("size", window->size()); } if (recurse) { recurseWrite(window); } s->endGroup(); } #include #include void E2Profile::recurseRead(QObject *object) { Q_CHECK_PTR(object); QCheckBox *checkbox = dynamic_cast(object); if (0 != checkbox) { checkbox->setChecked(s->value(checkbox->objectName()).toBool()); } QComboBox *combobox = dynamic_cast(object); if (0 != combobox) { combobox->setCurrentIndex(s->value(combobox->objectName()).toInt()); } QSplitter *spl = dynamic_cast(object); if (0 != spl) { spl->restoreState(s->value(spl->objectName()).toByteArray()); } foreach (QObject *child, object->children()) { recurseRead(child); } } void E2Profile::recurseWrite(QObject *object) { Q_CHECK_PTR(object); QCheckBox *checkbox = dynamic_cast(object); if (0 != checkbox) { s->setValue(checkbox->objectName(), checkbox->isChecked()); } QComboBox *combobox = dynamic_cast(object); if (0 != combobox) { s->setValue(combobox->objectName(), combobox->currentIndex()); } QSplitter *spl = dynamic_cast(object); if (0 != spl) { s->setValue(spl->objectName(), spl->saveState()); } foreach (QObject *child, object->children()) { recurseWrite(child); } } void E2Profile::restoreSplitter(QSplitter *spl) { Q_CHECK_PTR(spl); spl->restoreState(s->value("MainWindow/splitterSizes").toByteArray()); } void E2Profile::saveSplitter(QSplitter *spl) { Q_CHECK_PTR(spl); s->setValue("MainWindow/splitterSizes", spl->saveState()); } tmp9balx013/SrcPony/e2app.h0000644000175000017500000001403213616566001015503 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef e2APP_H #define e2APP_H #include #include #include "Translator.h" // #include "busio.h" //Include Bus Classes #include "i2cbus.h" #include "at90sbus.h" #include "at93cbus.h" #include "at250bus.h" #include "at250bus2.h" #include "picbus.h" #include "pic12bus.h" //#include "sxbus.h" #include "sdebus.h" #include "at89sbus.h" //#include "atmegabus.h" //#include "avr1200bus.h" #include "picbusnew.h" #include "imbus.h" #include "x2444bus.h" //Include Interface Classes #include "pgminter.h" #include "ponyioint.h" #include "easyi2c_interf.h" #include "ispinterf.h" #include "jdminter.h" //#include "jdmiointer.h" #include "dt006interf.h" #include "linuxsysfsint.h" #include "mpsse_interf.h" #include "e2profil.h" class e2AppWinInfo; enum AppStatus { AppReady, AppBusy }; class e2App : public cTranslator { public: e2App(); virtual ~e2App(); // Routines from vApp that are normally overridden // virtual vWindow* NewAppWin(vWindow* win, char* name, int w, int h, // vAppWinInfo* winInfo = 0); // replace about signal - slots // virtual void AppCommand(vWindow* win, ItemVal id, ItemVal val, CmdType cType); // virtual void KeyIn(vWindow*, vKey, unsigned int); // New routines for this particular app // int GetCounter() const // { // return winCounter; // } int TestPort(int port = -1, bool open_only = false); int OpenPort(int port = -1); void SetInitialBus(BusIO *p) { if (p) { iniBus = p; } } BusInterface *GetInterfPtr() { return busIntp; } BusIO **GetBusVectorPtr() { return busvetp; } void ClosePort(); int OpenBus(BusIO *p); void SleepBus(); void SetInterfaceType(HInterfaceType type = SIPROG_API); HInterfaceType GetInterfaceType() const { return iType; } int Calibration(); QString GetHelpFile() const { return helpfile; } QString GetOkSound() const { return ok_soundfile; } QString GetErrSound() const { return err_soundfile; } unsigned int GetPolarity() const { return polarity_control; } void SetPolarity(unsigned int val) { polarity_control = val; } int GetPort() const { return port_number; } void SetPort(int port) { if (port >= 0) { port_number = port; } } int LoadDriver(int start); void SetAWInfo(e2AppWinInfo *awi) { Q_CHECK_PTR(awi); awip = awi; } e2AppWinInfo *GetAWInfo() const { return awip; } bool scriptMode; //Script Mode int returnValue; //return value in Command Line mode protected: // AppWinInfo associated with this window e2AppWinInfo *awip; QString script_name; private: void initSettings(); void LookForBogoMips(); //should get bogomips // EK 2017 // we can fork the process // int winCounter; //open windows (child) counter // int abortFlag; //True if we have to abort current op // int ignoreFlag; //True if we have to ignore probe errors (usually false) HInterfaceType iType; //current interface type BusInterface *busIntp; //pointer to current interface type unsigned int polarity_control; //polarity for control lines //AutoTag //List of available interface types SIProgInterface siprog_apiI; PonyIOInterface siprog_ioI; EasyI2CInterface easyi2c_apiI; EasyI2CInterface easyi2c_ioI; AvrISPInterface avrisp_apiI; AvrISPInterface avrisp_ioI; Dt006Interface dt006_apiI; Dt006Interface dt006_ioI; JdmInterface jdm_apiI; // JdmIOInterface jdm_ioI; LinuxSysFsInterface linuxsysfs_ioI; MpsseInterface jtagkeyI; MpsseInterface ponyprog_ftI; int port_number; //port number used BusIO *iniBus; //pointer to current Bus BusIO *busvetp[NO_OF_BUSTYPE]; //array of pointers to available Bus //AutoTag //List of available bus types I2CBus iicB; At90sBus at90sB; At93cBus at93cB; At250Bus at250B; At250BigBus at250BigB; PicBus picB; Pic12Bus pic12B; //SxBus sxB; Sde2506Bus sdeB; At89sBus at89sB; // AtMegaBus atMegaB; // Avr1200Bus at1200B; PicBusNew picNewB; IMBus imB; X2444Bus x2444B; X2444Bus s2430B; QString helpfile; QString ok_soundfile; QString err_soundfile; }; #endif tmp9balx013/SrcPony/i2cbus.h0000644000175000017500000000640313616566001015666 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _I2CBUS_H #define _I2CBUS_H #include "busio.h" class I2CBus : public BusIO { public: I2CBus(BusInterface *ptr = 0); virtual ~I2CBus(); long Read(int slave, uint8_t *data, long length, int page_size = 0); long Write(int slave, uint8_t const *data, long length, int page_size = 0); int Start(uint8_t slave); int ReadByte(int ack, bool lsb = false); int WriteByte(int by, bool lsb = false); long StartRead(uint8_t slave, uint8_t *data, long length); long StartWrite(uint8_t slave, uint8_t const *data, long length); int Stop(); int Reset(); virtual int Open(int port) { Q_CHECK_PTR(busI); busI->SetI2CMode(true); return BusIO::Open(port); } void Close(); int TestPort(int port); //int Calibration(int slave = 0xA0); void SetDelay(); protected: void RecoverSlave(); int CheckBusy(); int SendStart(); int SendStop(); int SendBitMast(int b); int RecBitMast(); private: void setSCLSDA() { busI->SetClockData(); } int isSCLSDAuno() const { return busI->IsClockDataUP(); } void setSDA() { busI->SetDataOut(1); } void clearSDA() { busI->SetDataOut(0); } void setSCL() { busI->SetClock(1); } void clearSCL() { busI->SetClock(0); } int getSCL() const { return busI->GetClock(); } int getSDA() const { return busI->GetDataIn(); } void bitSDA(int b) { busI->SetDataOut(b); } }; #endif tmp9balx013/SrcPony/e24xx-1.cpp0000644000175000017500000000512213616566001016137 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // 24XX-1 are I2C Bus eeproms that uses 8 bits (1 bytes) for addresses. // // Total capacity can be up to 256 bytes. // #include #include "types.h" #include "e2awinfo.h" #include "e24xx-1.h" // Header file #include "errcode.h" #include "eeptypes.h" E24xx1::E24xx1(e2AppWinInfo *wininfo, BusIO *busp) : E24xx(wininfo, busp, 8, 128) //Max 8 bank of 128 bytes { // SetBankSize(1); } E24xx1::~E24xx1() { } int E24xx1::Probe(int probe_size) { (void)probe_size; int rval = E24xx::Probe(0); if (rval > 0) { // long size = GetSize(); n_bank = 1; // SetNoOfBank(n_bank); } return rval; } tmp9balx013/SrcPony/usbwatcher.h0000644000175000017500000000574513616566001016656 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // Copyright (C) 2019 LibUSB part, Eduard Kalinowski // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef USBWATCHER_H #define USBWATCHER_H #include #include #include #include //Include libsub #include "globals.h" class USBWatcher : public QObject { Q_OBJECT //QThread workerThread; public: USBWatcher(); ~USBWatcher(); bool hotplug_register(quint16 vid = 0, quint16 pid = 0); void hotplug_notify(bool connected, quint16 vid, quint16 pid) { if (connected) { vUSB.append(VidPid(vid, pid)); emit notify(true, vid, pid); } else { int idx = vUSB.indexOf(VidPid(vid, pid)); if (idx != -1) { vUSB.remove(idx); } emit notify(false, vid, pid); } } signals: void notify(bool connected, quint16 vid, quint16 pid); public slots: void doPoll(); private: void hotplug_deregister(); QVector vUSB; libusb_hotplug_callback_handle cbHandle; libusb_context *usb_ctx; QTimer *timer; int count; }; #endif // USBWATCHER_H tmp9balx013/SrcPony/at90sbus.h0000644000175000017500000001020013616566001016137 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT90SBUS_H #define _AT90SBUS_H #include "spi-bus.h" class At90sBus : public SPIBus { public: At90sBus(BusInterface *ptr = 0); //virtual ~At90sBus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); virtual int Reset(); virtual int Erase(int type = 0); virtual int ReadDeviceCode(int addr); virtual int WriteLockBits(uint32_t byte, long model = 0); virtual int WriteFuseBits(uint32_t byte, long model = 0); virtual uint32_t ReadLockBits(long model = 0); virtual uint32_t ReadFuseBits(long model = 0); virtual long ReadCalibration(int addr = 0); void SetFlashPagePolling(bool val); bool GetFlashPagePolling() const; void SetOld1200Mode(bool val) { old1200mode = val; } protected: //Programming commands const uint8_t EnableProg0, EnableProg1; const uint8_t ChipErase0, ChipErase1; const uint8_t ReadProgMemH0, ReadProgMemH1; const uint8_t ReadProgMemL0, ReadProgMemL1; const uint8_t WriteProgMemH0, WriteProgMemH1; const uint8_t WriteProgMemL0, WriteProgMemL1; const uint8_t WriteProgPageMem; const uint8_t ReadEEPMem0, ReadEEPMem1; const uint8_t WriteEEPMem0, WriteEEPMem1; const uint8_t ReadDevCode0, ReadDevCode1; const uint8_t ReadLock0, ReadLock1; const uint8_t WriteLock0, WriteLock1; const uint8_t ReadFuse0, ReadFuse1; const uint8_t WriteFuse0, WriteFuse1a, WriteFuse1b; const uint8_t ReadFuseHigh0, ReadFuseHigh1; const uint8_t WriteFuseHigh0, WriteFuseHigh1; const uint8_t ReadFuseExt0, ReadFuseExt1; const uint8_t WriteFuseExt0, WriteFuseExt1; const uint8_t ReadCalib0, ReadCalib1; int ReadEEPByte(long addr); void WriteEEPByte(long addr, int data); int ReadProgByte(long addr); void WriteProgByte(long addr, int data); int WriteProgPage(long addr, uint8_t const *data, long page_size, long timeout = 10000); int WaitReadyAfterWrite(int type, long addr, int data, long timeout = 10000); bool CheckBlankPage(uint8_t const *data, long length); void RefreshParameters(); //Polling codes const uint8_t p1_a, p2_a, pflash_a; const uint8_t p1_b, p2_b, pflash_b; //Erase and programming delays int twd_erase; int twd_prog; bool old1200mode; private: bool enable_flashpage_polling; }; #endif tmp9balx013/SrcPony/pic12bus.cpp0000644000175000017500000003061213616566001016461 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "pic12bus.h" #include "errcode.h" #include #include #include "e2cmdw.h" #define MAX_PROG_PULSES 8 // Constructor Pic12Bus::Pic12Bus(BusInterface *ptr) : BusIO(ptr), // DataMask(0xff), ProgMask(0x0fff), //12bit instruction ReadProgCode(0x04), //Read Data from Program Memory * LoadProgCode(0x02), //Load Data for Program Memory * // ReadDataCode(0x05), //Read Data from Data Memory * // LoadDataCode(0x03), //Load Data for Data Memory * // LoadConfigCode(0x00), //Load Configuration * IncAddressCode(0x06), //Increment Address * // EraseProgMem(0x09), //Bulk Erase Program Memory * // EraseDataMem(0x0b), //Bulk Erase Data Memory * BeginProgCode(0x08), //Begin Erase Programming Cycle * // BeginProgOnlyCode(0x18) //Begin Programming Only Cycle EndProgCode(0x0e) { qDebug() << Q_FUNC_INFO << "()"; OverProgrammingMult = 11; //Default OverProgramming X value (x11) OverProgrammingAdd = 0; //Default OverProgramming + value (+0) } // Desctructor Pic12Bus::~Pic12Bus() { // Close(); } void Pic12Bus::SetDelay() { int val = E2Profile::GetPICSpeed(); int n; switch (val) { case TURBO: n = 1; break; case FAST: n = 3; break; case SLOW: n = 20; break; case VERYSLOW: n = 100; break; case ULTRASLOW: n = 1000; break; default: n = 8; //Default (< 100KHz) break; } busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "() = " << n; } int Pic12Bus::SendDataBit(int b) { //setCLK(); //set SCK high //bitDI(b); //ShotDelay(); //clearCLK(); //device latch data bit now! //ShotDelay(); int err = OK; clearCLK(); busI->xferBit(err, b, SPI_MODE_1 | xMODE_WRONLY); return OK; } // returns a negative number in case of error, 0 or 1 otherwise int Pic12Bus::RecDataBit() { //setCLK(); //set SCK high (Pic output data now) //ShotDelay(); //b = getDO(); // sampling data on falling edge //clearCLK(); //ShotDelay(); int err = OK; clearCLK(); int rv = busI->xferBit(err, 1, SPI_MODE_1 | xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } int Pic12Bus::SendDataWord(long wo, int wlen) { int err = OK; clearCLK(); clearDI(); //transmit lsb first //for (int k = 0; k < wlen; k++) // SendDataBit(wo & (1 << k)); busI->xferWord(err, wo, SPI_MODE_1 | xMODE_WRONLY, wlen, true); setDI(); //1 usec from a command to the next //WaitUsec(GetDelay() / 4 + 1); ShotDelay(2); return OK; } long Pic12Bus::RecDataWord(int wlen) { int err = OK; clearCLK(); setDI(); //receive lsb first //long val = 0; //for (int k = 0; k < wlen; k++) // if (RecDataBit()) // val |= 1 << k; ShotDelay(); int rv = busI->xferWord(err, 0xffff, SPI_MODE_1 | xMODE_RDONLY, wlen, true); //WaitUsec(GetDelay() / 4 + 1); ShotDelay(2); if (err == OK) { return rv; } else { return err; } } int Pic12Bus::Reset(void) { qDebug() << Q_FUNC_INFO << " IN"; SetDelay(); SetMCLR(); //First bogus entry to charge capacitors WaitMsec(200); //150 clearDI(); ClearMCLR(); //Now reset the micro setCLK(); //keep Vdd on WaitMsec(20); clearCLK(); //Prepare for Program mode entry WaitMsec(10); SetMCLR(); //Program mode entry WaitMsec(10); current_address = -1; qDebug() << Q_FUNC_INFO << " OUT"; return OK; } long Pic12Bus::ReadConfig(uint16_t &data) { // Reset(); uint8_t *bp = (uint8_t *)&data; //Read Program Code SendCmdCode(ReadProgCode); uint16_t val = RecvProgCode(); if (val == ProgMask) { val = 0xffff; } #ifdef _BIG_ENDIAN_ *bp++ = (uint8_t)(val >> 8); *bp++ = (uint8_t)(val & 0xFF); #else *bp++ = (uint8_t)(val & 0xFF); *bp++ = (uint8_t)(val >> 8); #endif IncAddress(1); qDebug() << Q_FUNC_INFO << "(" << (hex) << val << ") OUT"; return OK; } long Pic12Bus::WriteConfig(uint16_t data) { qDebug() << Q_FUNC_INFO << "(" << (hex) << data << ") IN"; // Reset(); uint8_t *bp = (uint8_t *)&data; uint16_t val; //Write Program code #ifdef _BIG_ENDIAN_ val = (uint16_t)(*bp++) << 8; val |= (uint16_t)(*bp++); #else val = (uint16_t)(*bp++); val |= (uint16_t)(*bp++) << 8; #endif int k; for (k = 100; k > 0; k--) { ProgramPulse(val, 0); } IncAddress(1); return OK; } long Pic12Bus::BlankCheck(long length) { length >>= 1; //contatore da byte a word ReadStart(); //Point to first location // SendCmdCode(IncAddressCode); long len; for (len = 0; len < length - 1; len++) //Skip last location (RC calibration) { //Read Program Code SendCmdCode(ReadProgCode); if (CompareSingleWord(0xffff, RecvProgCode(), ProgMask)) { break; } if (ReadProgress(len * 100 / length)) { break; } IncAddress(1); } ReadEnd(); return (len == length); } long Pic12Bus::Read(int addr, uint8_t *data, long length, int page_size) { long len; qDebug() << Q_FUNC_INFO << "(" << addr << ", " << (hex) << data << ", " << (dec) << length << ") IN"; ReadStart(); length >>= 1; //contatore da byte a word //Point to first location // SendCmdCode(IncAddressCode); for (len = 0; len < length; len++) { //Read Program Code SendCmdCode(ReadProgCode); uint16_t val = RecvProgCode(); if (val == ProgMask) { val = 0xffff; } #ifdef _BIG_ENDIAN_ *data++ = (uint8_t)(val >> 8); *data++ = (uint8_t)(val & 0xFF); #else *data++ = (uint8_t)(val & 0xFF); *data++ = (uint8_t)(val >> 8); #endif IncAddress(1); if (ReadProgress(len * 100 / length)) { break; } } ReadEnd(); len <<= 1; //contatore da word a byte qDebug() << Q_FUNC_INFO << "() = " << len << " OUT"; return len; } long Pic12Bus::Write(int addr, uint8_t const *data, long length, int page_size) { long len; qDebug() << Q_FUNC_INFO << "(" << addr << ", " << (hex) << data << ", " << (dec) << length << ") IN"; WriteStart(); length >>= 1; //contatore da byte a word //The address pointer should already point to first address //location (via a ConfigRead or IncAddress) //Program cycle for (len = 0; len < length; len++) { uint16_t val; //Write Program code #ifdef _BIG_ENDIAN_ val = (uint16_t)(*data++) << 8; val |= (uint16_t)(*data++); #else val = (uint16_t)(*data++); val |= (uint16_t)(*data++) << 8; #endif int rv = WriteProgWord(val, length - 1); if (rv != OK) { len = rv; break; } if (WriteProgress(len * 100 / length)) { break; } } WriteEnd(); if (len > 0) { len <<= 1; //contatore da word a byte } qDebug() << Q_FUNC_INFO << "() = " << len << " ** " << GetLastProgrammedAddress() << " OUT"; return len; } int Pic12Bus::WriteProgWord(uint16_t val, long rc_addr) { int k; int rval = OK; qDebug() << Q_FUNC_INFO << "(" << (hex) << val << ", " << (dec) << current_address << ") IN"; //Check for RC calibration location if (current_address == rc_addr) { //Check for blank (erased cells) //Programma la RC calibration solamente se la locazione e` cancellata // e il valore da pgrogrammare corrisponde ad una MOVLW xx (0x0Cxx) SendCmdCode(ReadProgCode); if (CompareSingleWord(RecvProgCode(), 0xffff, ProgMask) == 0 && CompareSingleWord(val, 0x0C00, (ProgMask & 0xff00)) == 0) { SetLastProgrammedAddress(current_address << 1); for (k = 1; k <= MAX_PROG_PULSES; k++) { if (ProgramPulse(val, 1) == OK) { break; } } if (k > MAX_PROG_PULSES) { rval = E2ERR_WRITEFAILED; //Write error } else { qDebug() << "Pic12Bus::WriteProgWord(): Npulses = " << k; k *= OverProgrammingMult; k += OverProgrammingAdd; while (k--) { ProgramPulse(val, 0); //Program pulse without test } } } IncAddress(1); } else { //Check for blank (erased cells) SendCmdCode(ReadProgCode); if (CompareSingleWord(RecvProgCode(), 0xffff, ProgMask)) { rval = E2ERR_BLANKCHECKFAILED; } else { //Skip FFF words if (CompareSingleWord(val, 0xffff, ProgMask) != 0) { SetLastProgrammedAddress(current_address << 1); for (k = 1; k <= MAX_PROG_PULSES; k++) { if (ProgramPulse(val, 1) == OK) { break; } } if (k > MAX_PROG_PULSES) { rval = E2ERR_WRITEFAILED; //Write error } else { qDebug() << "Pic12Bus::WriteProgWord(): Npulses = " << k; k *= OverProgrammingMult; k += OverProgrammingAdd; while (k--) { ProgramPulse(val, 0); //Program pulse without test } } } IncAddress(1); } } qDebug() << Q_FUNC_INFO << "() = " << rval << " OUT"; return rval; } void Pic12Bus::IncAddress(int n) { qDebug() << Q_FUNC_INFO << "(" << n << ") IN"; while (n--) { SendCmdCode(IncAddressCode); current_address++; } qDebug() << Q_FUNC_INFO << "() OUT ** cur_addr = " << current_address; } int Pic12Bus::ProgramPulse(uint16_t val, int verify, int width) { int rval = OK; qDebug() << Q_FUNC_INFO << "(" << (hex) << val << ", " << (dec) << verify << ", " << width << ") IN"; SendCmdCode(LoadProgCode); SendProgCode(val); SendCmdCode(BeginProgCode); //Start programming pulse WaitUsec(width); SendCmdCode(EndProgCode); //Stop programming pulse WaitUsec(1000); //wait between pulses //Verify programmed location if (verify) { SendCmdCode(ReadProgCode); rval = CompareSingleWord(val, RecvProgCode(), ProgMask); } qDebug() << Q_FUNC_INFO << "() = " << rval << " OUT"; return rval; } int Pic12Bus::CompareSingleWord(uint16_t data1, uint16_t data2, uint16_t mask) { return (data1 & mask) != (data2 & mask); } int Pic12Bus::CompareMultiWord(uint8_t *data1, uint8_t *data2, long length, int split) { int retval = 0; if (data1 == 0 || data2 == 0 || (length & 1) != 0) { return BADPARAM; } if (!split) { long k; for (k = 0; k < length; k += 2) { uint16_t val1, val2; #ifdef _BIG_ENDIAN_ val1 = (uint16_t)(*data1++) << 8; val1 |= (uint16_t)(*data1++); val2 = (uint16_t)(*data2++) << 8; val2 |= (uint16_t)(*data2++); #else val1 = (uint16_t)(*data1++); val1 |= (uint16_t)(*data1++) << 8; val2 = (uint16_t)(*data2++); val2 |= (uint16_t)(*data2++) << 8; #endif if ((retval = CompareSingleWord(val1, val2, ProgMask))) { break; //Stop if a difference } } } else { retval = memcmp(data1, data2, length); } return retval; } tmp9balx013/SrcPony/infomdlg.h0000644000175000017500000001047413616566001016301 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2007 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef infoMDLG_H #define infoMDLG_H #include #include #include #include "Translator.h" #include "types.h" #include "ui_notesdlg.h" #include "ui_editdlg.h" // #include "ui_blockdlg.h" class e24xx_infoModalDialog : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: e24xx_infoModalDialog(QWidget *bw, int rlv, uint16_t crc, long size, const QString title = translate(STR_MSGDEVINFO)); virtual ~e24xx_infoModalDialog(); // Destructor // virtual int infoAction(char* msg = "Device Info"); private slots: void onOk(); protected: private: }; class other_infoModalDialog : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: other_infoModalDialog(QWidget *bw, long fsize, long esize, uint16_t crc, const QString title = translate(STR_MSGDEVINFO)); virtual ~other_infoModalDialog(); // Destructor // virtual int infoAction(char* msg = "Device Info"); private slots: void onOk(); protected: private: }; class notesModalDialog : public QDialog, public cTranslator, public Ui::NotesDialog { Q_OBJECT public: notesModalDialog(QWidget *bw, QString &id, QString &cm, const QString title = translate(STR_MSGDEVNOTE)); virtual ~notesModalDialog(); // Destructor // QString GetId(); // QString GetComment(); // virtual int notesAction(char* msg = translate(STR_MSGDEVNOTE)); private slots: void onOk(); protected: private: QString *id_ptr; QString *cm_ptr; QString id_txt; QString cmt_txt; }; #if 0 class editModalDialog : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: editModalDialog(QWidget *bw, int curval = 0, const QString title = translate(STR_MSGEDITBUG)); virtual ~editModalDialog(); // Destructor // virtual int editAction(char* msg, int &retval); int GetVal(); private slots: void onOk(); void onEdit(); protected: private: int oldval; }; class editModalDialog2 : public QDialog, public cTranslator, public Ui::EditDialog { Q_OBJECT public: editModalDialog2(QWidget *bw, const QString curval = "", const QString title = translate(STR_MSGEDITBUG)); virtual ~editModalDialog2(); // Destructor // virtual int editAction(char* msg, char *text, int len); QString GetVal(); private slots: void onOk(); protected: private: QString val; }; #endif #endif tmp9balx013/SrcPony/pic12bus.h0000644000175000017500000001070513616566001016127 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _PIC12BUS_H #define _PIC12BUS_H #include "types.h" #include "busio.h" #include "pgminter.h" class Pic12Bus : public BusIO { public: Pic12Bus(BusInterface *ptr = 0); virtual ~Pic12Bus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); // int Erase(int type = ALL_TYPE); int Reset(); long ReadConfig(uint16_t &data); long WriteConfig(uint16_t data); void DisableCodeProtect(); int CompareSingleWord(uint16_t data1, uint16_t data2, uint16_t mask); int CompareMultiWord(uint8_t *data1, uint8_t *data2, long length, int split); void SetDelay(); long BlankCheck(long length); void IncAddress(int n); protected: int SendDataWord(long wo, int wlen = 16); long RecDataWord(int wlen = 16); int WaitReadyAfterWrite(long timeout = 5000); int WriteProgWord(uint16_t val, long rc_addr); int ProgramPulse(uint16_t val, int verify = 0, int width = 100); //100uSec default pulse width int SendCmdCode(int opcode) { return SendDataWord(opcode, 6); } int SendProgCode(uint16_t data) { //the code is 14 bit data with leading and trailing 0's data &= ProgMask; data <<= 1; return SendDataWord(data); } uint16_t RecvProgCode() { return (uint16_t)(RecDataWord() >> 1) & ProgMask; } /** int SendDataCode(uint16_t data) { //the code is 8 bit data with leading and trailing 0's data &= DataMask; data <<= 1; return SendDataWord(data); } uint16_t RecvDataCode() { return (uint16_t)(RecDataWord() >> 1) & DataMask; } **/ void SetMCLR() { busI->SetControlLine(1); } void ClearMCLR() { busI->SetControlLine(0); } long current_address; int OverProgrammingMult; int OverProgrammingAdd; // const uint16_t DataMask; const uint16_t ProgMask; //Command Opcode const uint8_t ReadProgCode; const uint8_t LoadProgCode; // const uint8_t ReadDataCode; // const uint8_t LoadDataCode; // const uint8_t LoadConfigCode; const uint8_t IncAddressCode; // const uint8_t EraseProgMem; // const uint8_t EraseDataMem; const uint8_t BeginProgCode; // const uint8_t BeginProgOnlyCode; const uint8_t EndProgCode; private: int SendDataBit(int b); int RecDataBit(); void bitDI(int b) { busI->SetDataOut(!b); } void setDI() { busI->SetDataOut(0); } void clearDI() { busI->SetDataOut(1); } void setCLK() { busI->SetClock(1); } void clearCLK() { busI->SetClock(0); } int getDO() const { return busI->GetDataIn(); } }; #endif tmp9balx013/SrcPony/pic125xx.cpp0000644000175000017500000001353213616566001016416 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "pic125xx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include #include "e2awinfo.h" #define CONFIG_SIZE ( 8 * sizeof(uint16_t) ) Pic125xx::Pic125xx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { config_word = 0xffff; } Pic125xx::~Pic125xx() { } int Pic125xx::CodeProtectAdjust(uint16_t &config, int read) { config = ~config & 0x0fff; return OK; } int Pic125xx::SecurityRead(uint32_t &bits) { int rv = GetBus()->ReadConfig(config_word); if (rv == OK) { uint16_t config = config_word; CodeProtectAdjust(config, 1); bits = config; } return rv; } int Pic125xx::SecurityWrite(uint32_t bits) { uint16_t config = (uint16_t)bits; CodeProtectAdjust(config, 0); config_word = config; return GetBus()->WriteConfig(config_word); } int Pic125xx::Probe(int probe_size) { return 1; } int Pic125xx::Read(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if (type & CONFIG_TYPE) { // read the config locations // this must be the FIRST operation (just after reset) uint32_t f; SecurityRead(f); GetAWInfo()->SetLockBits(f); } else { //Skip configuration word GetBus()->IncAddress(1); } if (type & PROG_TYPE) { rv = ReadProg(); } } return rv; } int Pic125xx::Write(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if (type & PROG_TYPE) { //Skip configuration word GetBus()->IncAddress(1); rv = WriteProg(); } if (rv > 0 && (type & CONFIG_TYPE)) { // write the config locations // this must be the FIRST operation (just after reset) uint32_t f; GetBus()->Reset(); f = GetAWInfo()->GetLockBits(); SecurityWrite(f); } } else if (rv == 0) { rv = E2ERR_WRITEFAILED; } return rv; } int Pic125xx::Verify(int type) { GetBus()->Reset(); if (GetNoOfBank() == 0) { return BADPARAM; } int rval = -1; if (GetSize() >= GetSplitted()) { unsigned char *localbuf = new unsigned char[GetSize()]; int v_prog = OK, v_config = OK; if (type & CONFIG_TYPE) { uint32_t f; SecurityRead(f); qDebug() << "Pic125xx::Verify() ** " << f << " <-> " << (unsigned long)GetAWInfo()->GetLockBits(); if (GetAWInfo()->GetLockBits() == f) { v_config = OK; } else { v_config = 1; } } else { //Skip configuration word GetBus()->IncAddress(1); } if (type & PROG_TYPE) { v_prog = VerifyProg(localbuf); } rval = (v_prog == OK && v_config == OK) ? 1 : 0; delete[] localbuf; } return rval; } int Pic125xx::VerifyProg(unsigned char *localbuf) { int rval = -1; int size = GetSplitted(); int base = 0; //Verify only programmed bytes (to save time in big devices) // long v_len = size - 2; //Don't verify RC Calibration location long v_len = size; if (GetBus()->GetLastProgrammedAddress() > 0 && GetBus()->GetLastProgrammedAddress() < size - 1) { v_len = GetBus()->GetLastProgrammedAddress() + 2; GetBus()->ClearLastProgrammedAddress(); //reset last_programmed_addr, so next verify not preceeded by write verify all the flash } //Set blank locations to default 0xFF (erased) memset(localbuf, 0xFF, size); // read the current flash content and store it in localbuf rval = GetBus()->Read(0, localbuf, v_len); if (rval != v_len) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = GetBus()->CompareMultiWord(GetBufPtr() + base, localbuf + base, v_len, 0) == 0 ? OK : 1; } return rval; } /** //Write Flash program memory (don't program RC calibration value) int Pic125xx::WriteProg() { int rv; int size = GetSplitted()-2; //Don't program last location (RC calibration value) int base = 0; rv = GetBus()->Write(0, GetBufPtr()+base, size); if ( rv != size ) { if (rv > 0) rv = OP_ABORTED; } return rv; } **/ tmp9balx013/SrcPony/types.h0000644000175000017500000000114113616566001015635 0ustar carstencarsten/* types.h Defines types for portability. Copyright (c) Claudio Lanconelli 1993,94,95,96 All Rights Reserved. */ #ifndef _TYPES_H #define _TYPES_H #ifdef __GNUC__ #include #elif defined(_MSC_VER) // && _MSC_VER == 1200 //MSVC doesn't define stdint.h typedef unsigned long uint32_t; typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef signed long int32_t; typedef signed short int16_t; typedef signed char int8_t; #endif #ifndef HIDDEN #define HIDDEN static #endif #ifdef __GNUC__ #define PACK __attribute__ ((packed)) #else #define PACK #endif #endif tmp9balx013/SrcPony/filebuf.cpp0000644000175000017500000001034713616566001016450 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // #include #include #include #include #include "types.h" #include "filebuf.h" // Header file #include "e2awinfo.h" #include "errcode.h" FileBuf::FileBuf(e2AppWinInfo *wininfo) { SetAWInfo(wininfo); } FileBuf::~FileBuf() { } void FileBuf::SetAWInfo(e2AppWinInfo *wininfo) { if (wininfo) { awi = wininfo; } } e2AppWinInfo *FileBuf::GetAWInfo() { return awi; } uint8_t *FileBuf::GetBufPtr() const { return (uint8_t *)awi->GetBufPtr(); } long FileBuf::GetBufSize() const { return awi->GetBufSize(); } int FileBuf::GetNoOfBlock() const { return awi->GetNoOfBlock(); } void FileBuf::SetNoOfBlock(int no_blk) { awi->SetNoOfBlock(no_blk); } int FileBuf::GetBlockSize() const { return awi->GetBlockSize(); } void FileBuf::SetFileName(const QString &name) { awi->SetFileName(name); } QString FileBuf::GetFileName() { return awi->GetFileName(); } QString FileBuf::GetStringID() { return awi->GetStringID(); } void FileBuf::SetStringID(const QString &s) { awi->SetStringID(s); } QString FileBuf::GetComment() { return awi->GetComment(); } void FileBuf::SetComment(const QString &s) { awi->SetComment(s); } int FileBuf::GetRollOver() const { return awi->GetBankRollOver(); } uint32_t FileBuf::GetLockBits() const { return awi->GetLockBits(); } uint32_t FileBuf::GetFuseBits() const { return awi->GetFuseBits(); } void FileBuf::SetRollOver(int rlv) { awi->SetBankRollOver(rlv); } long FileBuf::GetSplitted() const { return awi->GetSplittedInfo(); } void FileBuf::SetSplitted(long spl) { awi->SetSplittedInfo(spl); } void FileBuf::SetLockBits(uint32_t bits) { awi->SetLockBits(bits); } void FileBuf::SetFuseBits(uint32_t bits) { awi->SetFuseBits(bits); } void FileBuf::SetCRC(uint16_t c) { awi->SetCRC(c); } long FileBuf::GetEEpromType() const { return awi->GetEEPId(); } int FileBuf::GetEEpromPriType() const { return GetE2PPriType(awi->GetEEPId()); } int FileBuf::GetEEpromSubType() const { return GetE2PSubType(awi->GetEEPId()); } void FileBuf::SetEEpromType(int pritype, int subtype) { extern long BuildE2PType(int pritype, int subtype); awi->SetEEProm(BuildE2PType(pritype, subtype)); } void FileBuf::SetEEpromType(unsigned long id) { awi->SetEEProm(id); } long FileBuf::GetFileSize(QFile &fh) { if (fh.exists()) { return fh.size(); } else { return -1; } } tmp9balx013/SrcPony/sernumdlg.cpp0000644000175000017500000001552113616566001017033 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include "types.h" #include "sernumdlg.h" SerNumDialog::SerNumDialog(QWidget *bw, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); setTextWidgets(); E2Profile::readDialogSettings(this, false); loc = 0; val = 0; memtype = false; autoinc = false; size = 1; fmt = FMT_BIG_ENDIAN; val = E2Profile::GetSerialNumVal(); E2Profile::GetSerialNumAddress(loc, size, memtype); autoinc = E2Profile::GetSerialNumAutoInc(); fmt = E2Profile::GetSerialNumFormat(); if (loc < 0) { loc = 0; } if (size < 0 || size > 4) { size = 4; } txiLoc->setText(QString().sprintf("0x%04lX", loc)); txiLen->setText(QString().sprintf("%d", size)); txiVal->setText(QString().sprintf("%lu", val)); chkMemOffset->setChecked(memtype); chkAutoInc->setChecked(autoinc); if (fmt == FMT_LITTLE_ENDIAN) { rdbLittleEnd->setChecked(true); rdbBigEnd->setChecked(false); } else { rdbLittleEnd->setChecked(false); rdbBigEnd->setChecked(true); } connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); qDebug() << Q_FUNC_INFO; } SerNumDialog::~SerNumDialog() { qDebug() << Q_FUNC_INFO; } void SerNumDialog::setTextWidgets() { pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); lblLoc->setText(translate(STR_MSGADDRESS)); lblLen->setText(translate(STR_MSGSIZE2)); lblVal->setText(translate(STR_MSGVALUE)); chkMemOffset->setText(translate(STR_MSGOFFSET)); chkAutoInc->setText(translate(STR_MSGSNAUTOINC)); frmFormat->setTitle(translate(STR_MSGFORMAT)); rdbLittleEnd->setText(translate(STR_MSGLITTLEEND)); rdbBigEnd->setText(translate(STR_MSGBIGENDIAN)); } void SerNumDialog::onOk() { bool ok; long l = txiLoc->text().toLong(&ok, 0); if (ok == true) { loc = l; } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiLoc->setPalette(*palette); return; } l = txiLen->text().toLong(&ok, 0); if (ok == true) { size = l; } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiLen->setPalette(*palette); return; } l = txiVal->text().toLong(&ok, 0); if (ok == true) { val = l; } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiVal->setPalette(*palette); return; } if (rdbLittleEnd->isChecked() == true) { fmt = FMT_LITTLE_ENDIAN; } else { fmt = FMT_BIG_ENDIAN; } memtype = chkMemOffset->isChecked(); autoinc = chkAutoInc->isChecked(); E2Profile::SetSerialNumAddress(loc, size, memtype); E2Profile::SetSerialNumVal(val); E2Profile::SetSerialNumFormat(fmt); E2Profile::SetSerialNumAutoInc(autoinc); E2Profile::writeDialogSettings(this, false); accept(); } OscCalibDialog::OscCalibDialog(QWidget *bw, e2AppWinInfo *aw, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); loc = 0; val = 0; memtype = false; enabled = false; size = 1; qDebug() << Q_FUNC_INFO; E2Profile::readDialogSettings(this, false); E2Profile::GetCalibrationAddress(enabled, loc, size, memtype); lblLoc->setText(translate(STR_MSGADDRESS)); lblVal->setText(translate(STR_MSGVALUE)); chkMemOffset->setText(translate(STR_MSGOFFSET)); chkEnabled->setText(translate(STR_CALIBRENABLED)); loc = (loc < 0) ? 0 : loc; txiLoc->setText(QString().sprintf("0x%04lX", loc)); txiVal->setText(QString().sprintf("%d", val)); chkMemOffset->setChecked(memtype); chkEnabled->setChecked(enabled); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); pushRead->setText(translate(STR_BTNREAD)); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(pushRead, SIGNAL(clicked()), this, SLOT(onRead())); awip = aw; } OscCalibDialog::~OscCalibDialog() { qDebug() << Q_FUNC_INFO; } void OscCalibDialog::onOk() { bool ok1, ok2; long i = txiLoc->text().toLong(&ok1, 0); if (ok1) { loc = i; } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiLoc->setPalette(*palette); } int v = txiVal->text().toInt(&ok2, 0); if (ok2) { val = v; } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiVal->setPalette(*palette); } if (ok1 && ok2) { memtype = chkMemOffset->isChecked(); enabled = chkEnabled->isChecked(); E2Profile::SetCalibrationAddress(enabled, loc, size, memtype); E2Profile::writeDialogSettings(this, false); accept(); } } void OscCalibDialog::onRead() { int val = awip->ReadOscCalibration(); if (val >= 0) { txiVal->setText(QString().sprintf("0x%02X", val)); } else { qWarning() << "Error " << val; //if (verbose != verboseNo) //{ // rval = OnError(rval); //} QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiVal->setPalette(*palette); txiVal->setText(QString("Error %1").arg(val)); } } tmp9balx013/SrcPony/e2dlg.h0000644000175000017500000000677213616566001015505 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef e2DIALOG_H #define e2DIALOG_H #include #include #include #include "Translator.h" #include "globals.h" #include "ui_e2dlg.h" #include "usbwatcher.h" class e2Dialog : public QDialog, public cTranslator, public Ui::E2Dialog { Q_OBJECT public: e2Dialog(QWidget *bw, const QString title = translate(STR_MSGINTSETUP)); //virtual ~e2Dialog(); // Destructor protected: public slots: void onUSB(bool connected, quint16 vid, quint16 pid); private slots: void onOk(); void onTest(); void on_tabWidget_currentChanged(int index); void on_cbxInterfCOM_currentIndexChanged(int index); void on_cbxInterfCOMNum_currentIndexChanged(int index); void on_cbxInterfLPT_currentIndexChanged(int index); void on_cbxInterfLPTNum_currentIndexChanged(int index); void on_cbxInterfUSB_currentIndexChanged(int index); void on_cbxInterfUSBNum_currentIndexChanged(int index); void on_cbxInterfGPIO_currentIndexChanged(int index); void on_cbxInterfGPIONum_currentIndexChanged(int index); void on_pushDefaultsUSB_clicked(); void on_pushDefaultsCOM_clicked(); void on_pushDefaultsLPT_clicked(); void on_pushDefaultsGPIO_clicked(); private: int Test(int p = -1, bool open_only = false) const; void setWidgetsText(); void getSettings(); void setSettings(); void recurseCbxHide(QObject *object); USBWatcher watcher; QStringList lptList; QStringList comList; QStringList usbList; QStringList gpioList; int port_no; //Index of selected port in portList int lpt_no, com_no, usb_no, gpio_no; VidPid usb_vp; HInterfaceType interf_type; }; #endif tmp9balx013/SrcPony/jdminter.h0000644000175000017500000000434013616566001016311 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _JDMINTERFACE_H #define _JDMINTERFACE_H #include "pgminter.h" class JdmInterface : public SIProgInterface { public: // virtual int Open(int com_no); // virtual void Close(); virtual void SetInvDataOut(int sda = 1) { SIProgInterface::SetDataOut(sda); } protected: private: }; #endif tmp9balx013/SrcPony/at250xx.h0000644000175000017500000000466213616566001015717 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT250XX_H #define _AT250XX_H #include "types.h" #include "device.h" #include "at250bus.h" class At250xx : public Device { public: At250xx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~At250xx(); virtual int Probe(int probe_size = 0); virtual int Read(int probe = 1, int type = ALL_TYPE); virtual int Write(int probe = 1, int type = ALL_TYPE); virtual int Verify(int type = ALL_TYPE); protected: At250Bus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/at89sbus.h0000644000175000017500000001041013616566001016152 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT89SBUS_H #define _AT89SBUS_H #include "spi-bus.h" class At89sBus : public SPIBus { public: At89sBus(BusInterface *ptr = 0); //virtual ~At89sBus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); virtual int Reset(); virtual int Erase(int type = 0); int ReadDeviceCode(int addr); int WriteLockBits(uint32_t val, long model); int WriteFuseBits(uint32_t val, long model); int ReadLockBits(uint32_t &res, long model); int ReadFuseBits(uint32_t &res, long model); void SetDelay(); void SetPagePolling(bool prog, bool val) { if (prog) { enable_progpage_polling = val; } else { enable_datapage_polling = val; } } bool GetPagePolling(bool prog) const { return prog ? enable_progpage_polling : enable_datapage_polling; } void SetCompatibilityMode(bool old) { oldmode = old; } protected: //Programming commands const uint8_t EnableProg0, EnableProg1; const uint8_t ChipErase0, ChipErase1, OldChipErase1; const uint8_t ReadProgByteMem, OldReadProgMem; const uint8_t WriteProgByteMem, OldWriteProgMem; const uint8_t ReadProgPageMem; const uint8_t WriteProgPageMem; const uint8_t ReadDataByteMem, OldReadDataMem; const uint8_t WriteDataByteMem, OldWriteDataMem; const uint8_t ReadDataPageMem; const uint8_t WriteDataPageMem; const uint8_t ReadUserFuses0, ReadUserFuses1; const uint8_t WriteUserFuses0, WriteUserFuses1; const uint8_t ReadLockBits0, ReadLockBits1; const uint8_t WriteLockBits0, WriteLockBits1, OldWriteLockBits1; const uint8_t ReadSignatureByte; int ReadDataByte(long addr); void WriteDataByte(long addr, int data); int ReadProgByte(long addr); void WriteProgByte(long addr, int data); int WriteProgPage(long addr, uint8_t const *data, long page_size, long timeout = 5000); int WriteDataPage(long addr, uint8_t const *data, long page_size, long timeout = 5000); void ReadProgPage(long addr, uint8_t *data, long page_size, long timeout = 5000); void ReadDataPage(long addr, uint8_t *data, long page_size, long timeout = 5000); int WaitReadyAfterWrite(int type, long addr, int data, long timeout = 5000); bool CheckBlankPage(uint8_t const *data, long length); private: bool enable_datapage_polling, enable_progpage_polling; //Erase and programming delays int twd_erase; int twd_prog; bool oldmode; }; #endif tmp9balx013/SrcPony/infomdlg.cpp0000644000175000017500000002333213616566001016631 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include "e2cmdw.h" #include "globals.h" #include "infomdlg.h" class e2CmdWindow; e24xx_infoModalDialog::e24xx_infoModalDialog(QWidget *bw, int rlv, uint16_t crc, long size, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } if (rlv == 1) { txiFrom->setText(translate(STR_YES)); } else if (rlv == 2) { txiFrom->setText(translate(STR_NO)); } else { txiFrom->setText(translate(STR_MSGUNKNOWN)); } lblFrom->setText(translate(STR_MSGCRC)); // crc label lblTo->setText(translate(STR_MSGEEPSIZE)); // size label lblVal->setText(translate(STR_MSGFLASHSIZE)); // flash size label QString str; str = QString().sprintf("%04Xh", crc); txiTo->setText(str); txiTo->setReadOnly(true); str = QString().sprintf("%ld Byte", size); txiVal->setText(str); txiVal->setReadOnly(true); lblVal->setHidden(true); txiVal->setHidden(true); pushOk->setText(translate(STR_BTNCLOSE)); pushCancel->setHidden(true); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); // connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } e24xx_infoModalDialog::~e24xx_infoModalDialog() { qDebug() << "infoModalDialog::~infoModalDialog()"; } void e24xx_infoModalDialog::onOk() { accept(); } other_infoModalDialog::other_infoModalDialog(QWidget *bw, long fsize, long esize, uint16_t crc, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } QString str; lblFrom->setText(translate(STR_MSGCRC)); // crc label lblTo->setText(translate(STR_MSGEEPSIZE)); // size label lblVal->setText(translate(STR_MSGFLASHSIZE)); // flash size label str = QString().sprintf("%04Xh", crc); txiFrom->setText(str); txiFrom->setReadOnly(true); str = QString().sprintf("%ld Byte", fsize); txiTo->setText(str); txiTo->setReadOnly(true); str = QString().sprintf("%ld Byte", esize); txiVal->setText(str); txiVal->setReadOnly(true); pushOk->setText(translate(STR_BTNCLOSE)); pushCancel->setHidden(true); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); // connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } other_infoModalDialog::~other_infoModalDialog() { qDebug() << "infoModalDialog::~infoModalDialog()"; } void other_infoModalDialog::onOk() { accept(); } notesModalDialog::notesModalDialog(QWidget *bw, QString &id, QString &cm, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } qDebug() << "notesModalDialog::notesModalDialog()"; id_ptr = &id; cm_ptr = &cm; lblStrID->setText(translate(STR_MSGCHIPID)); lblCommnt->setText(translate(STR_MSGNOTE)); if (id.length() && cm.length()) { id_txt = id; txiStrID->setText(id_txt); cmt_txt = cm; txiCommnt->setText(cmt_txt); } pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } notesModalDialog::~notesModalDialog() { qDebug() << "notesModalDialog::~notesModalDialog()"; } void notesModalDialog::onOk() { cmt_txt = txiCommnt->text(); id_txt = txiStrID->text(); *id_ptr = id_txt; *cm_ptr = cmt_txt; accept(); } #if 0 editModalDialog::editModalDialog(QWidget *bw, int curval, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } qDebug() << "editModalDialog::editModalDialog()"; if (curval < 0) { curval = 0; } lblFrom->setText(translate(STR_MSGHEX)); lblTo->setText(translate(STR_MSGDECIMAL)); lblVal->setText(translate(STR_MSGCHAR)); oldval = curval; QString str; str = QString().sprintf("%02X", curval); txiFrom->setText(str); connect(txiFrom, SIGNAL(changed()), this, SLOT(onEdit())); str = QString().sprintf("%d", curval); txiTo->setText(str); connect(txiTo, SIGNAL(changed()), this, SLOT(onEdit())); str = QString().sprintf("%c", curval); txiVal->setText(str); connect(txiVal, SIGNAL(changed()), this, SLOT(onEdit())); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } editModalDialog::~editModalDialog() { qDebug() << "editModalDialog::~editModalDialog()"; } void editModalDialog::onOk() { accept(); } int editModalDialog::GetVal() { return oldval; } void editModalDialog::onEdit() { int newval; bool ok; QLineEdit *l = static_cast(sender()); disconnect(txiFrom, SIGNAL(changed()), this, SLOT(onEdit())); // hex disconnect(txiTo, SIGNAL(changed()), this, SLOT(onEdit())); // dec disconnect(txiVal, SIGNAL(changed()), this, SLOT(onEdit())); // char if (l == txiFrom) // hex { QString n = txiFrom->text(); newval = n.toInt(&ok, 16); if (ok == true) { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::black); txiFrom->setPalette(*palette); } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiFrom->setPalette(*palette); } } if (l == txiTo) // dec { QString n = txiTo->text(); newval = n.toInt(&ok, 10); if (ok == true) { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::black); txiTo->setPalette(*palette); } else { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiTo->setPalette(*palette); } } if (l == txiVal) // char { QString n = txiVal->text(); if (n.length() != 1) { ok = false; QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::red); txiVal->setPalette(*palette); } else { newval = static_cast(n.at(0).toLatin1()); ok = true; QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, Qt::black); txiVal->setPalette(*palette); } } if (ok == true) { if (oldval != newval) { oldval = newval; txiFrom->setText(QString().sprintf("%02X", newval)); txiTo->setText(QString().sprintf("%d", newval)); txiVal->setText(QString().sprintf("%c", newval)); } } connect(txiFrom, SIGNAL(changed()), this, SLOT(onEdit())); connect(txiTo, SIGNAL(changed()), this, SLOT(onEdit())); connect(txiVal, SIGNAL(changed()), this, SLOT(onEdit())); } const int MAXLEN = 80; editModalDialog2::editModalDialog2(QWidget *bw, const QString curval, const QString title) : QDialog(bw) { setupUi(this); setWindowTitle(title); e2CmdWindow *cmdw = static_cast(bw); if (cmdw->getStyleSheet().length() > 0) { setStyleSheet(cmdw->getStyleSheet()); } lblFrom->setHidden(true); txiFrom->setHidden(true); lblTo->setHidden(true); txiTo->setHidden(true); lblVal->setText(translate(STR_MSGCHAR)); qDebug() << "editModalDialog::editModalDialog()"; val = curval; if (val.length() > MAXLEN) { val = val.left(MAXLEN); } txiVal->setText(val); pushOk->setText(translate(STR_BTNOK)); pushCancel->setText(translate(STR_BTNCANC)); connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); connect(pushCancel, SIGNAL(clicked()), this, SLOT(reject())); } editModalDialog2::~editModalDialog2() { qDebug() << "editModalDialog::~editModalDialog()"; } QString editModalDialog2::GetVal() { return val; } void editModalDialog2::onOk() { val = txiVal->text(); if (val.length() > MAXLEN) { val = val.left(MAXLEN); } accept(); } #endif tmp9balx013/SrcPony/e2profil.h0000644000175000017500000002242213616566001016220 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E2PROFILE_H #define _E2PROFILE_H #include #include #include "types.h" #include "globals.h" #include "interfconv.h" #include #include #include #define CLOCKINV (1<<0) #define RESETINV (1<<1) #define DININV (1<<2) #define DOUTINV (1<<3) #define POWERINV (1<<4) #define ENBUSINV (1<<5) #define CLOCKININV (1<<6) #define CTRLININV (1<<7) #define RELOAD_idx 0 #define READFLASH_idx 1 #define READEEP_idx 2 #define BYTESWAP_idx 3 #define SETID_idx 4 #define READOSCCAL_idx 5 #define ERASE_idx 6 #define FLASH_idx 7 #define EEPROM_idx 8 #define LOCK_idx 9 #define RELOAD_YES (1<sync(); } static HInterfaceType GetParInterfType(); static void SetParInterfType(HInterfaceType type); static int GetPortNumber(); static void SetPortNumber(int value); static int GetBogoMips(); static void SetBogoMips(int value); static long GetLastDevType(); static void SetLastDevType(long devtype); static QString GetLastFile(int &data, int index = 0); static void SetLastFile(const QString &name, int data = ALL_TYPE); static void SetLastScript(const QString &name); static QStringList GetLastScripts(); static unsigned int GetPolarityLines(); static void SetPolarityLines(unsigned int polarity_control); static int GetSPIPageWrite(); static void SetSPIPageWrite(int page_write = 1); static int GetI2CPageWrite(); static void SetI2CPageWrite(int page_write = 1); static int GetI2CBaseAddr(); static void SetI2CBaseAddr(int base_addr = 0xA0); static int GetI2CSpeed(); static void SetI2CSpeed(int speed = NORMAL); static int GetSPIResetPulse(); static void SetSPIResetPulse(int delay = 100); static int GetSPIDelayAfterReset(); static void SetSPIDelayAfterReset(int delay = 50); static int GetAT89DelayAfterReset(); static void SetAT89DelayAfterReset(int delay = 50); static void GetPrinterSettings(QPrinter &p); static void SetPrinterSettings(QPrinter &p); static int GetAVRDelayAfterReset(); static void SetAVRDelayAfterReset(int delay = 50); static int GetPowerUpDelay(); static void SetPowerUpDelay(int delay = 200); static int GetSPISpeed(); static void SetSPISpeed(int speed = NORMAL); static int GetMegaPageDelay(); static void SetMegaPageDelay(int delay = 25); static int GetMicroWireSpeed(); static void SetMicroWireSpeed(int speed = NORMAL); static int GetPICSpeed(); static void SetPICSpeed(int speed = NORMAL); static int GetSDESpeed(); static void SetSDESpeed(int speed = NORMAL); static int GetIMBusSpeed(); static void SetIMBusSpeed(int speed = NORMAL); static int GetAVRProgDelay(); static void SetAVRProgDelay(int delay = 10); static int GetFontSize(); static void SetFontSize(int sz = 9); static QStringList GetLastFiles(); static int GetAVREraseDelay(); static void SetAVREraseDelay(int delay = 30); static int GetMDAProgDelay(); static void SetMDAProgDelay(int delay = 30); static int GetNVMProgDelay(); static void SetNVMProgDelay(int delay = 30); static unsigned long GetSerialNumVal(); static void SetSerialNumVal(unsigned long val = 0); static int GetSerialNumAddress(long &start, int &size, bool &mtype); static void SetSerialNumAddress(unsigned long start, int size, bool mtype); static FmtEndian GetSerialNumFormat(); static void SetSerialNumFormat(FmtEndian fmt); static bool GetSerialNumAutoInc(); static void SetSerialNumAutoInc(bool val = true); static long GetProgramOptions(); static void SetProgramOptions(long prog_option); static int GetCalibrationAddress(bool &enabled, long &start, int &size, bool &mtype); static void SetCalibrationAddress(bool enabled, unsigned long start, int size, bool mtype); static QString GetLogFileName(); static void SetLogFileName(const QString &name); static QString GetLangDir(); static void SetLangDir(const QString &name); static QString GetCurrentLang(); static void SetCurrentLang(const QString &name); static bool GetLogEnabled(); static void SetLogEnabled(bool enabled = false); static bool GetSkipStartupDialog(); static void SetSkipStartupDialog(bool skip = false); static bool GetClearBufBeforeLoad(); static void SetClearBufBeforeLoad(bool val = false); static bool GetClearBufBeforeRead(); static void SetClearBufBeforeRead(bool val = false); static bool GetAt89PageOp(); static void SetAt89PageOp(bool val = true); static bool Get8253FallEdge(); static void Set8253FallEdge(bool falledge); static QString GetLanguageCode(); static void SetLanguageCode(const QString &code); static bool GetSoundEnabled(); static void SetSoundEnabled(bool val = true); static bool GetVerifyAfterWrite(); static void SetVerifyAfterWrite(bool enabled = true); static unsigned int GetJDMCmd2CmdDelay(); static void SetJDMCmd2CmdDelay(unsigned int delay = 4000); static bool GetAutoDetectPorts(); static void SetAutoDetectPorts(bool enabled = true); static int GetCOMAddress(unsigned int &com1, unsigned int &com2, unsigned int &com3, unsigned int &com4); static void SetCOMAddress(unsigned int com1, unsigned int com2, unsigned int com3, unsigned int com4); static int GetLPTAddress(unsigned int &lpt1, unsigned int &lpt2, unsigned int &lpt3); static void SetLPTAddress(unsigned int lpt1, unsigned int lpt2, unsigned int lpt3); static QString GetConfigFile() { return s->fileName(); } static QString GetCOMDevName(); static void SetCOMDevName(const QString &name); static QStringList GetCOMDevList(); static void SetCOMDevList(const QStringList &lst); static QString GetLPTDevName(); static void SetLPTDevName(const QString &name); static QStringList GetLPTDevList(); static void SetLPTDevList(const QStringList &lst); static FileType GetDefaultFileType(); static void SetDefaultFileType(FileType ft); //static QString GetHtmlBrowseApp(); //static void SetHtmlBrowseApp(const QString &name); static int GetInterfacePort(); static void SetInterfacePort(int port_index); static void GetInterfacePins(HInterfaceType type, InterfPins &pins); static InterfPins GetInterfacePins(HInterfaceType type) { InterfPins pins; GetInterfacePins(type, pins); return pins; } static void SetInterfacePins(HInterfaceType type, const InterfPins &pins); static bool GetEditBufferEnabled(); static void SetEditBufferEnabled(bool enable); static void readDialogSettings(QWidget *window, bool recurse = true); static void writeDialogSettings(QWidget *window, bool recurse = true); static void restoreSplitter(QSplitter *spl); static void saveSplitter(QSplitter *spl); protected: static void recurseRead(QObject *object); static void recurseWrite(QObject *object); static void SetLastFiles(const QStringList &l); static void SetLastScripts(const QStringList &l); static QSettings *s; private: static int getSpeedIndex(const QString &sp); static QString getSpeedName(int speed); }; #endif tmp9balx013/SrcPony/at250bus.h0000644000175000017500000000556413616566001016053 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT250BUS_H #define _AT250BUS_H #include "spi-bus.h" class At250Bus : public SPIBus { public: At250Bus(BusInterface *ptr = 0); //virtual ~At250Bus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); int Reset(); protected: virtual int ReadEEPByte(int addr); virtual void WriteEEPByte(int addr, int data); int ReadEEPStatus(); int WriteEEPStatus(int data); void EndCycle(void); int WaitEndOfWrite(int timeout = 0); // 07/08/99 //Programming commands const uint8_t WriteEnable; const uint8_t WriteDisable; const uint8_t ReadStatus; const uint8_t WriteStatus; const uint8_t ReadData; const uint8_t WriteData; //Status flags const uint8_t NotReadyFlag; const uint8_t WenFlag; const uint8_t BPFlags; const int loop_timeout; private: void setNCS() { ClearReset(); //27/05/98 } void clearNCS() { SetReset(); //27/05/98 } }; #endif tmp9balx013/SrcPony/at93cxx8.h0000644000175000017500000000462613616566001016077 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT93CXX8_H #define _AT93CXX8_H #include "types.h" #include "at93cbus.h" #include "device.h" class At93cxx8 : public Device { public: At93cxx8(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~At93cxx8(); int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: At93cBus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/main.cpp0000644000175000017500000000464713616566001015766 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include #include "e2cmdw.h" int main(int argc, char **argv) { QApplication app(argc, argv); Q_INIT_RESOURCE(ponyprog); app.setApplicationName("PonyProg"); app.setOrganizationName("PonyProg"); app.setWindowIcon(QIcon(":/icons/ponyprog-small.png")); // Identify locale and load translation if available // QString locale = QLocale::system().name(); e2CmdWindow mainWin; mainWin.show(); return app.exec(); }; tmp9balx013/SrcPony/i2cbus.cpp0000644000175000017500000002166413616566001016227 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "globals.h" #include "e2profil.h" #include "i2cbus.h" #include "errcode.h" #include "e2cmdw.h" #include #include #define BUSYDELAY 100 #define SDATIMEOUT 200 I2CBus::I2CBus(BusInterface *ptr) : BusIO(ptr) { } I2CBus::~I2CBus() { Close(); } int I2CBus::CheckBusy() { if (busI->CheckDataLines(BUSYDELAY, 1, 1)) { return OK; } else { return IICERR_BUSBUSY; } } /** I2CBus specification ** -- Standard I2CBus -- SCL T-low = 5 usec min T-high = 4 usec min SCL Data setup time = 300 nsec min Data hold time = 300 nsec min ALL fall time = 300 nsec max rise time = 1 usec max -- Fast I2CBus -- SCL T-low = 1.3 usec min T-high = 0.6 usec min ALL fall time = 300 nsec max rise time = 300 nsec max **/ int I2CBus::SendStart() { register int err; setSDA(); ShotDelay(2); //Help repeated start condition setSCL(); #ifdef SCLTIMEOUT if (getSCL() == 0) { int k; for (k = SCLTIMEOUT; getSCL() == 0 && k > 0; k--) { WaitUsec(1); } if (k == 0) { return IICERR_SCLCONFLICT; } } #endif ShotDelay(2); int recoveryCnt = 0; while (CheckBusy() != OK && recoveryCnt++ < 3) { //Recover I2C RecoverSlave(); } if ((err = CheckBusy()) != OK) { return err; } clearSDA(); ShotDelay(4); // tHD;STA = 4 usec clearSCL(); ShotDelay(); return OK; } int I2CBus::SendStop() { clearSCL(); ShotDelay(2); clearSDA(); ShotDelay(2); setSCL(); #ifdef SCLTIMEOUT if (getSCL() == 0) { int k; for (k = SCLTIMEOUT; getSCL() == 0 && k > 0; k--) { WaitUsec(1); } if (k == 0) { qWarning() << Q_FUNC_INFO << "*** SCL error"; return IICERR_SCLCONFLICT; } } #else ShotDelay(); #endif ShotDelay(5); // tSU;STOP = 4.7 usec setSDA(); ShotDelay(2); if (getSDA() == 0) { qWarning() << Q_FUNC_INFO << "*** SDA error"; return IICERR_SDACONFLICT; } //tBUF = 4.7 usec ShotDelay(2); return OK; } int I2CBus::SendBitMast(int inbit) { int err = OK; busI->xferBit(err, inbit, xMODE_WRONLY); return err; } int I2CBus::RecBitMast() { int err = OK; setSDA(); int rv = busI->xferBit(err, 1, xMODE_RDONLY); if (err == OK) { return rv; } else { return err; } } void I2CBus::RecoverSlave() { int k; for (k = 0; k < 9; k++) { SendBitMast(1); if (getSDA() != 0) { break; } } setSCL(); ShotDelay(); } int I2CBus::WriteByte(int by, bool lsb) { int err = OK; busI->xferByte(err, by, xMODE_WRONLY, 8, lsb); if (err == OK) { //Receive Ack setSDA(); int lrb = busI->xferBit(err, 1, xMODE_RDONLY); if (err == OK) { if (lrb) { err = IICERR_NOTACK; } } } return err; } int I2CBus::ReadByte(int ack, bool lsb) { int err = OK; setSDA(); int rv = busI->xferByte(err, 0xff, xMODE_RDONLY, 8, lsb); if (err == OK) { //Send Ack busI->xferBit(err, ack, xMODE_WRONLY); } if (err == OK) { return rv; } else { return err; } } void I2CBus::SetDelay() { int val = E2Profile::GetI2CSpeed(); int n; switch (val) { case TURBO: n = 1; // as fast as your PC can (dangerous) break; case FAST: n = 2; // > 100 Khz, < 400 Khz break; case SLOW: n = 20; // (< 25 Khz) break; case VERYSLOW: n = 80; break; case ULTRASLOW: n = 500; break; default: n = 5; //Default (< 100KHz) break; } Q_CHECK_PTR(busI); busI->SetDelay(n); qDebug() << Q_FUNC_INFO << "=" << n; } long I2CBus::Read(int slave, uint8_t *data, long length, int page_size) { long len; //qDebug() << Q_FUNC_INFO << "(" << (hex) << slave << "," << (void *)data << "," << (dec) << length << ") - IN"; len = StartRead(slave, data, length); if (len == length) if (err_no || Stop()) { len = 0; } //qDebug() << Q_FUNC_INFO << "=" << len << ", err_no =" << err_no << " - OUT"; return len; } long I2CBus::Write(int slave, uint8_t const *data, long length, int page_size) { long len; //qDebug() << Q_FUNC_INFO << "(" << (hex) << slave << "," << data << "," << (dec) << length << ") - IN"; len = StartWrite(slave, data, length); if (len == length) if (err_no || Stop()) { len = 0; } //qDebug() << Q_FUNC_INFO << "=" << len << ", err_no =" << err_no << " - OUT"; return len; } int I2CBus::Start(uint8_t slave) { int temp; // send Start if ((temp = SendStart())) { err_no = temp; return err_no; } if ((temp = WriteByte(slave)) != OK) { err_no = (temp == IICERR_NOTACK) ? IICERR_NOADDRACK : temp; last_addr = slave; return err_no; } return OK; } /* se length e` zero, viene ricevuto un byte senza ack per cercare di * liberare il bus da uno slave che per qualche motivo e` ancora in * trasmissione. In questo caso data deve puntare ad un buffer di (almeno) * un byte. */ long I2CBus::StartRead(uint8_t slave, uint8_t *data, long length) { int temp; long len = length; //qDebug() << Q_FUNC_INFO << "(" << (hex) << slave << "," << data << "," << (dec) << length << ") - IN"; if (len > 0) { // send Start if ((temp = SendStart())) { err_no = temp; return 0; } if ((temp = WriteByte(slave | 1)) != 0) { err_no = (temp == IICERR_NOTACK) ? IICERR_NOADDRACK : temp; last_addr = slave | 1; return 0; } while (len > 1) { if ((temp = ReadByte(0)) < 0) { err_no = temp; goto fineR; } *data++ = (uint8_t)temp; len--; } } // last byte received without acknowledge if ((temp = ReadByte(1)) < 0) { err_no = temp; goto fineR; } len--; *data = (uint8_t)temp; err_no = 0; fineR: //qDebug() << Q_FUNC_INFO << "=" << (long)(length - len) << ", err_no =" << err_no << " - OUT"; return length - len; } long I2CBus::StartWrite(uint8_t slave, uint8_t const *data, long length) { int error; long len = length; //qDebug() << Q_FUNC_INFO << "(" << (hex) << slave << "," << data << "," << (dec) << length << ") - IN"; if (len == 0) { return 0; } if ((error = SendStart())) { err_no = error; return 0; } if ((error = WriteByte(slave & 0xFE))) { err_no = (error == IICERR_NOTACK) ? IICERR_NOADDRACK : error; last_addr = slave & 0xFE; return 0; } while (len > 0) { if ((error = WriteByte(*data++)) != 0) { err_no = error; goto fineW; } len--; } fineW: //qDebug() << Q_FUNC_INFO << "=" << (long)(length - len) << ", err_no =" << err_no << " - OUT"; return length - len; } int I2CBus::Stop(void) { //qDebug() << Q_FUNC_INFO << "- IN"; err_no = SendStop() ? IICERR_STOP : 0; //qDebug() << Q_FUNC_INFO << "=" << err_no << "- OUT"; return err_no; } int I2CBus::Reset(void) { qDebug() << Q_FUNC_INFO << "- IN"; SetDelay(); uint8_t c; Read(0x00, &c, 0); setSCLSDA(); WaitMsec(100); //a big delay to allow no-CMOS 2402 to work qDebug() << Q_FUNC_INFO << "- OUT"; return OK; } void I2CBus::Close(void) { qDebug() << Q_FUNC_INFO << "busI=" << (hex) << busI << (dec); setSCLSDA(); BusIO::Close(); } int I2CBus::TestPort(int port) { int ret_val = busI->TestSave(port); if (ret_val == OK) { // Send general call address 0x00 int err = Start(0x00 | 1); if (err != OK && err != IICERR_NOADDRACK) { ret_val = err; } } busI->TestRestore(); return ret_val; } tmp9balx013/SrcPony/ppuser.h0000644000175000017500000000257713616566001016025 0ustar carstencarsten/* * $Id: ppuser.h,v 1.2 2004/11/30 17:46:48 lancos Exp $ * User-space parallel port device driver (header file). * * Copyright (C) 1998 Tim Waugh * * May be freely distributed as part of Linux */ #define PP_MAJOR 99 #define PP_IOCTL 'p' /* Set mode to e.g. PARPORT_MODE_PCEPP */ #define PPSETMODE _IOW(PP_IOCTL, 0x80, int) /* Read/write status */ #define PPRSTATUS _IOR(PP_IOCTL, 0x81, unsigned char) #define PPWSTATUS _IOW(PP_IOCTL, 0x82, unsigned char) /* Read/write control */ #define PPRCONTROL _IOR(PP_IOCTL, 0x83, unsigned char) #define PPWCONTROL _IOW(PP_IOCTL, 0x84, unsigned char) /* Read/write data */ #define PPRDATA _IOR(PP_IOCTL, 0x85, unsigned char) #define PPWDATA _IOW(PP_IOCTL, 0x86, unsigned char) /* Read/write econtrol */ #define PPRECONTROL _IOR(PP_IOCTL, 0x87, unsigned char) #define PPWECONTROL _IOW(PP_IOCTL, 0x88, unsigned char) /* Read/write FIFO */ #define PPRFIFO _IOR(PP_IOCTL, 0x89, unsigned char) #define PPWFIFO _IOW(PP_IOCTL, 0x8a, unsigned char) /* Claim the port to start using it */ #define PPCLAIM _IO(PP_IOCTL, 0x8b) /* Release the port when you aren't using it */ #define PPRELEASE _IO(PP_IOCTL, 0x8c) /* Yield the port (release it if another driver is waiting, * then reclaim) */ #define PPYIELD _IO(PP_IOCTL, 0x8d) tmp9balx013/SrcPony/lpt_ext_interf.cpp0000644000175000017500000000400613616566001020055 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "lpt_ext_interf.h" LPTInterface LptExtInterface::lpt; LPTIOInterface LptExtInterface::lptio; tmp9balx013/SrcPony/ponyioint.cpp0000644000175000017500000001717613616566001017073 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // PonyIO (SI-Prog) card interface #include "ponyioint.h" #include "errcode.h" #include "e2cmdw.h" #include #include /* modem control register bits * bit 0: DTR (pin 4) * bit 1: RTS (pin 7) */ /* modem status register bits * bit 4: CTS (pin 8 DB9) * bit 5: DSR (pin 6) * bit 6: RI (pin 9) * bit 7: DCD (pin 1) */ #define WB_SCL 1 /* COM: rts (pin 7) */ #define WB_SDA 0 /* COM: dtr (pin 4) */ # undef RB_SCL /* Not used */ #define RB_SDA 4 /* COM: cts (pin 8) */ #define RB_TEST 5 /* COM: dsr (pin 6) */ #define WF_SCL (1 << WB_SCL) #define WF_SDA (1 << WB_SDA) //#define RF_SCL (1 << RB_SCL) #define RF_SDA (1 << RB_SDA) #define RF_TEST (1 << RB_TEST) #ifdef Q_OS_LINUX //# include # include #endif enum UartRegs { thrOfst, ierOfst, iirOfst, lcrOfst, mcrOfst, lsrOfst, msrOfst }; PonyIOInterface::PonyIOInterface() { //qDebug() << "PonyIOInterface::PonyIOInterface()"; //DeInstall(); //old_portno = GetInstalled(); } PonyIOInterface::~PonyIOInterface() { Close(); } #define BREAK_MASK 0x40 //se res == 1 abilita il BREAK --> Tx = +12v // altrimenti disabilita il BREAK --> Tx = -12v void PonyIOInterface::SetControlLine(int res) { qDebug() << "PonyIOInterface::SetControlLine(" << res << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { qDebug() << "PonyIOInterface::SetControlLine() XX"; if (cmdWin->GetPolarity() & RESETINV) { res = !res; } qDebug() << "PonyIOInterface::SetControlLine() " << (hex) << lcrOfst << (dec); #ifdef Q_OS_WIN32 if (res) { SetCommBreak(hCom); } else { ClearCommBreak(hCom); } #else if (res) { OutPort(BREAK_MASK, lcrOfst); } else { OutPort(0, lcrOfst); } #endif } } //Note that with PonyProg SI interface 3 lines provide the power: // SCL, SDA, RESET. If any of these lines are on (>5V) the power is ON int PonyIOInterface::SetPower(bool onoff) { qDebug() << "PonyIOInterface::SetPower(" << onoff << ")"; if (onoff) { SetControlLine(1); // SetSCLSDA(); //29/05/98 non funziona la verifica subito dopo la scrittura delle 93Cx6 } else { ClearClockData(); SetControlLine(0); } return OK; } int PonyIOInterface::Open(int com_no) { qDebug() << "PonyIOInterface::Open(" << com_no << ") IN"; int ret_val = OK; if (GetInstalled() != com_no) { if ((ret_val = OpenSerial(com_no)) == OK) { Install(com_no); } } qDebug() << "PonyIOInterface::Open() = " << ret_val << " OUT"; return ret_val; } void PonyIOInterface::Close() { qDebug() << "PonyIOInterface::Close() IN"; if (IsInstalled()) { SetPower(false); CloseSerial(); DeInstall(); } qDebug() << "PonyIOInterface::Close() OUT"; } void PonyIOInterface::SetDataOut(int sda) { qDebug() << "PonyIOInterface::SetDataOut(" << sda << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & DOUTINV)) { sda = !sda; } if (sda) { OutPortMask(WF_SDA, 1); } else { OutPortMask(WF_SDA, 0); } } } void PonyIOInterface::SetClock(int scl) { qDebug() << "PonyIOInterface::SetClock(" << scl << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if ((cmdWin->GetPolarity() & CLOCKINV)) { scl = !scl; } if (scl) { OutPortMask(WF_SCL, 1); } else { OutPortMask(WF_SCL, 0); } } } void PonyIOInterface::SetClockData() { qDebug() << "PonyIOInterface::SetClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); uint8_t cpreg = GetCPWReg(); if (control & CLOCKINV) { cpreg &= ~WF_SCL; } else { cpreg |= WF_SCL; } if (control & DOUTINV) { cpreg &= ~WF_SDA; } else { cpreg |= WF_SDA; } OutPort(cpreg); } } void PonyIOInterface::ClearClockData() { qDebug() << "PonyIOInterface::ClearClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); uint8_t cpreg = GetCPWReg(); if (control & CLOCKINV) { cpreg |= WF_SCL; } else { cpreg &= ~WF_SCL; } if (control & DOUTINV) { cpreg |= WF_SDA; } else { cpreg &= ~WF_SDA; } OutPort(cpreg); } } int PonyIOInterface::GetDataIn() { qDebug() << "PonyIOInterface::GetDataIn() *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & DININV) { return ~ InPort() & RF_SDA; } else { return InPort() & RF_SDA; } } else { return E2ERR_NOTINSTALLED; } } int PonyIOInterface::GetClock() { return 1; } int PonyIOInterface::GetPresence() const { qDebug() << "PonyIOInterface::GetPresence() *** Inst=" << IsInstalled(); if (IsInstalled()) { return InPort() & RF_TEST; } else { return E2ERR_NOTINSTALLED; } } int PonyIOInterface::IsClockDataUP() { qDebug() << "PonyIOInterface::IsClockDataUP() *** Inst=" << IsInstalled(); return GetDataIn(); } int PonyIOInterface::IsClockDataDOWN() { qDebug() << "PonyIOInterface::IsClockDataDOWN() *** Inst=" << IsInstalled(); return !GetDataIn(); } int PonyIOInterface::TestPort(int com_no) { qDebug() << "PonyIOInterface::TestPort(" << com_no << ") IN"; int ret_val = TestSave(com_no); if (ret_val == OK) { int a, b; ret_val = E2ERR_OPENFAILED; SetClockData(); w.WaitMsec(50); a = (GetCPWReg() & WF_SCL) ? 1 : 0; b = GetPresence() ? 1 : 0; if (a == b) { ClearClockData(); w.WaitMsec(50); a = (GetCPWReg() & WF_SCL) ? 1 : 0; b = GetPresence() ? 1 : 0; if (a == b) { SetClockData(); w.WaitMsec(50); a = (GetCPWReg() & WF_SCL) ? 1 : 0; b = GetPresence() ? 1 : 0; if (a == b) { ret_val = OK; } } } } TestRestore(); qDebug() << "PonyIOInterface::TestPort() = " << ret_val << " OUT"; return ret_val; } tmp9balx013/SrcPony/eeptypes.cpp0000644000175000017500000004136413616566001016675 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include "types.h" #include "globals.h" #include "eeptypes.h" //AutoTag //Device type description vectors static QVector const eep24xx_map = { {"24XX Auto", E2400, AUTOSIZE_ID / 256, -1, -1, -1 }, {"2402", E2402, 1, -1, -1, -1}, {"2404", E2404, 2, -1, -1, -1}, {"2408", E2408, 4, -1, -1, -1}, {"2416", E2416, 8, -1, -1, -1} }; static QVector const eep24xx1A_map = { // "Auto", {"2401-A", E2401_A, 1, -1, -1, -1} }; static QVector const eep24xx1B_map = { // "Auto", {"2401-B", E2401_B, 1, -1, -1, -1} }; static QVector const eep24xx2_map = { // "Auto", {"24E16", E24E16, 8, -1, -1, -1}, {"2432", E2432, 16, -1, -1, -1}, {"2464/2465", E2464, 32, -1, -1, -1}, {"24128", E24128, 64, -1, -1, -1}, {"24256", E24256, 128, -1, -1, -1}, {"24512", E24512, 256, -1, -1, -1} }; static QVector const eep24xx5_map = { // "Auto", {"24325", E24325, 16, -1, -1, -1}, {"24645", E24645, 32, -1, -1, -1} }; static QVector const eepAT90_map = { {"ATmega8515", ATmega8515, (KB(8) + 512), KB(8), 64, -1 }, {"ATmega8535", ATmega8535, (KB(8) + 512), KB(8), 64, -1 }, {"ATmega48", ATmega48, (KB(4) + 256), KB(4), 64, -1}, {"ATmega8", ATmega8, (KB(8) + 512), KB(8), 64, -1}, {"ATmega88", ATmega88, (KB(8) + 512), KB(8), 64, -1}, {"ATmega16", ATmega16, (KB(16) + 512), KB(16), 128, -1}, {"ATmega161", ATmega161, (KB(16) + 512), KB(16), 128, -1}, {"ATmega162", ATmega162, (KB(16) + 512), KB(16), 128, -1}, {"ATmega163", ATmega163, (KB(16) + 512), KB(16), 128, -1}, {"ATmega164", ATmega164, (KB(16) + 512), KB(16), 128, -1}, {"ATmega168", ATmega168, (KB(16) + 512), KB(16), 128, -1}, {"ATmega169", ATmega169, (KB(16) + 512), KB(16), 128, -1}, {"ATmega32", ATmega32, (KB(32) + KB(1)), KB(32), 128, -1}, {"ATmega323", ATmega323, (KB(32) + KB(1)), KB(32), 128, -1}, {"ATmega324", ATmega324, (KB(32) + KB(1)), KB(32), 128, -1}, {"ATmega328", ATmega328, (KB(32) + KB(1)), KB(32), 128, -1}, // new (RG 22.06.2012) {"ATmega603", ATmega603, (KB(64) + KB(2)), KB(64), 256, -1}, {"ATmega103", ATmega103, (KB(128) + KB(4)), KB(128), 256, -1}, {"ATmega64", ATmega64, (KB(64) + KB(2)), KB(64), 256, -1}, {"ATmega640", ATmega640, (KB(64) + KB(4)), KB(64), 256, -1}, {"ATmega644", ATmega644, (KB(64) + KB(2)), KB(64), 256, -1}, {"ATmega128", ATmega128, (KB(128) + KB(4)), KB(128), 256, -1}, {"ATmega1280", ATmega1280, (KB(128) + KB(4)), KB(128), 256, -1}, {"ATmega1281", ATmega1281, (KB(128) + KB(4)), KB(128), 256, -1}, {"ATmega1284", ATmega1284, (KB(128) + KB(4)), KB(128), 256, -1}, // new (RG 10.06.2017) {"ATmega2560", ATmega2560, (KB(256) + KB(4)), KB(256), 256, -1}, {"ATmega2561", ATmega2561, (KB(256) + KB(4)), KB(256), 256, -1}, {"ATtiny12", ATtiny12, (KB(1) + 64), KB(1), 0, -1}, {"ATtiny13", ATtiny13, (KB(1) + 64), KB(1), 32, -1}, {"ATtiny15", ATtiny15, (KB(1) + 64), KB(1), 0, -1}, {"ATtiny22", ATtiny22, (KB(2) + 128), KB(2), 0, -1}, {"ATtiny24", ATtiny24, (KB(2) + 128), KB(2), 32, -1}, // new 08.01.2015 @RG {"ATtiny25", ATtiny25, (KB(2) + 128), KB(2), 32, -1}, {"ATtiny26", ATtiny26, (KB(2) + 128), KB(2), 32, -1}, {"ATtiny261", ATtiny261, (KB(2) + 128), KB(2), 32, -1}, // {"ATtiny28", ATtiny28, }, {"ATtiny2313", ATtiny2313, (KB(2) + 128), KB(2), 32, -1}, {"ATtiny4313", ATtiny4313, (KB(4) + 256), KB(4), 64, -1}, // new 16.09.2015 @RG {"ATtiny44", ATtiny44, (KB(4) + 256), KB(4), 64, -1}, // new 08.01.2015 @RG {"ATtiny45", ATtiny45, (KB(4) + 256), KB(4), 64, -1}, {"ATtiny461", ATtiny461, (KB(4) + 256), KB(4), 64, -1}, {"ATtiny84", ATtiny84, (KB(8) + 512), KB(8), 64, -1}, // new 08.01.2015 @RG {"ATtiny85", ATtiny85, (KB(8) + 512), KB(8), 64, -1}, {"ATtiny861", ATtiny861, (KB(8) + 512), KB(8), 64, -1}, // "AVR Auto", AT90S0000 {"AT90S1200", AT90S1200, (KB(1) + 64), KB(1), 0, -1}, {"AT90S2313", AT90S2313, (KB(2) + 128), KB(2), 0, -1}, {"AT90S2323", AT90S2323, (KB(2) + 128), KB(2), 0, -1}, {"AT90S2333", AT90S2333, (KB(2) + 128), KB(2), 0, -1}, {"AT90S2343", AT90S2343, (KB(2) + 128), KB(2), 0, -1}, {"AT90S4414", AT90S4414, (KB(4) + 256), KB(4), 0, -1}, {"AT90S4433", AT90S4433, (KB(4) + 256), KB(4), 0, -1}, {"AT90S4434", AT90S4434, (KB(4) + 256), KB(4), 0, -1}, {"AT90S8515", AT90S8515, (KB(8) + 512), KB(8), 0, -1}, {"AT90C8534", AT90S8534, (KB(8) + 512), KB(8), 0, -1}, {"AT90S8535", AT90S8535, (KB(8) + 512), KB(8), 0, -1}, {"AT90CAN32", AT90CAN32, (KB(32) + KB(1)), KB(32), 128, -1}, {"AT90CAN64", AT90CAN64, (KB(64) + KB(2)), KB(64), 256, -1}, {"AT90CAN128", AT90CAN128, (KB(128) + KB(4)), KB(128), 256, -1} }; static QVector const eepAt89s_map = { // "AT89SXX Auto", AT89S0000 {"AT89S8252", AT89S8252, KB(8) + KB(2), KB(8), 0, -1 }, {"AT89S8253", AT89S8253, KB(12) + KB(2), KB(12), 64, 1 }, {"AT89S51", AT89S51, KB(4), KB(4), 256, -1 }, {"AT89S52", AT89S52, KB(8), KB(8), 256, -1 }, {"AT89S53", AT89S53, KB(12), KB(12), 0, -1 } }; static QVector const eep93x6_map = { // "93XX Auto", E9300 {"9306", E9306, 16, -1, -1, 64}, {"9346", E9346, 64, -1, -1, 64}, {"9356", E9356, 128, -1, -1, 256}, {"9357", E9357, 128, -1, -1, 128}, {"9366", E9366, 256, -1, -1, 256}, {"9376", E9376, 512, -1, -1, 1024}, {"9386", E9386, 1024, -1, -1, 1024} }; static QVector const eep93xx8_map = { // "93XX Auto", {"9306", E9306_8, 32, -1, -1, 128}, {"9346", E9346_8, 128, -1, -1, 128}, {"9356", E9356_8, 256, -1, -1, 512}, {"9357", E9357_8, 256, -1, -1, 256}, {"9366", E9366_8, 512, -1, -1, 512}, {"9376", E9376_8, 1024, -1, -1, 2048}, {"9386", E9386_8, 2048, -1, -1, 2048}, }; static QVector const eepPic16_map = { // "PIC16XX Auto", {"PIC16X83", PIC1683, KB(1) + 64, KB(1), -1, -1}, {"PIC16X84", PIC1684, KB(2) + 64, KB(2), -1, -1} }; static QVector const eepPic168xx_map = { {"PIC168XX Auto", PIC16800, AUTOSIZE_ID, 0, -1, -1}, {"PIC16F84A", PIC1684A, KB(2) + 64, KB(2), -1, -1}, {"PIC16F870", PIC16870, KB(4) + 64, KB(4), -1, -1}, {"PIC16F871", PIC16871, KB(4) + 64, KB(4), -1, -1}, {"PIC16F872", PIC16872, KB(4) + 64, KB(4), -1, -1}, {"PIC16F873", PIC16873, KB(8) + 128, KB(8), -1, -1}, {"PIC16F874", PIC16874, KB(8) + 128, KB(8), -1, -1}, {"PIC16F876", PIC16876, KB(16) + 256, KB(16), -1, -1}, {"PIC16F877", PIC16877, KB(16) + 256, KB(16), -1, -1}, {"PIC16F873A", PIC16873A, KB(8) + 128, KB(8), -1, -1}, {"PIC16F874A", PIC16874A, KB(8) + 128, KB(8), -1, -1}, {"PIC16F876A", PIC16876A, KB(16) + 256, KB(16), -1, -1}, {"PIC16F877A", PIC16877A, KB(16) + 256, KB(16), -1, -1}, {"PIC16F627", PIC16627, KB(1) + 128, KB(1), -1, -1}, {"PIC16F628", PIC16628, KB(2) + 128, KB(2), -1, -1} }; static QVector const eepPic125_map = { // "PIC125XX Auto",PIC12500 {"PIC12C508", PIC12508, KB(1), KB(1), -1, -1}, {"PIC12C509", PIC12509, KB(2), KB(2), -1, -1}, {"PIC12C508A", PIC12508A, KB(1), KB(1), -1, -1}, {"PIC12C509A", PIC12509A, KB(2), KB(2), -1, -1}, {"PIC12E518", PIC12E518, KB(1), KB(1), -1, -1}, {"PIC12E519", PIC12E519, KB(2), KB(2), -1, -1}, {"PIC12C671", PIC12671, KB(1), KB(1), -1, -1}, {"PIC12C672", PIC12672, KB(2), KB(2), -1, -1}, {"PIC12CE673", PIC12673, KB(1), KB(1), -1, -1}, {"PIC12CE674", PIC12674, KB(2), KB(2), -1, -1} }; static QVector const eep250xx_map = { // "250X0 Auto", {"25010", E25010, 128, -1, -1, -1}, {"25020", E25020, 256, -1, -1, -1}, {"25040", E25040, 512, -1, -1, -1} }; static QVector const eep25xxx_map = { // "25XXX Auto",E25XX0 {"25080", E25080, KB(1), -1, -1, -1}, {"25160", E25160, KB(2), -1, -1, -1}, {"25320", E25320, KB(4), -1, -1, -1}, {"2564X/95640", E25640, KB(8), -1, -1, -1}, {"25128", E25128, KB(16), -1, -1, -1}, {"25256", E25256, KB(32), -1, -1, -1} }; static QVector const eep2506_map = { // "250X0 Auto",E25000 {"SDE2506", E2506, 128, -1, -1, -1} }; static QVector const eepnvm3060_map = { // "NVMXX Auto",ENVM3000 {"MDA2062", EMDA2062, 128, -1, -1, -1}, {"NVM3060", ENVM3060, 512, -1, -1, -1} }; static QVector const eep2444_map = { // "XX Auto", {"S2430", S24H30, 8, -1, -1, 8}, {"X2444", X24C44, 16, -1, -1, 16}, {"X2445", X24C45, 16, -1, -1, 16} }; static QVector const eep17xxx_map = { // "Auto",AT1700 {"AT1765", AT1765, KB(8), -1, -1, -1}, {"AT17128", AT17128, KB(16), -1, -1, -1}, {"AT17256", AT17256, KB(32), -1, -1, -1}, {"AT17512", AT17512, KB(64), -1, -1, -1}, {"AT17010", AT17010, KB(128), -1, -1, -1}, }; long BuildE2PType(int pritype, int subtype) { return (((long)pritype & 0x7FFF) << 16) | (subtype & 0x7FFF); } int GetE2PSubType(unsigned long type) { if (type == EID_INVALID) { return -1; } else { return (int)(type & 0x7FFF); } } int GetE2PPriType(unsigned long type) { // qDebug() << "GetE2PPriType" << type << ((type >> 16) & 0x7F); if (type == EID_INVALID) { return -1; } else { return (int)((type >> 16) & 0x7F); } } chipInfo GetChipInfo(QVector &c, long subtype) { chipInfo info = {}; for (int i = 0; i < c.count(); i++) { // extract only subtype if ((c.at(i).id & 0x7FFF) == (subtype & 0x7FFF)) { info = c.at(i); break; } } return info; } // EK 2017 // don't worry, it's not a copy of vector // it's smart pointer to vector static QVector const GetMap(int pritype) { switch (pritype) { //AutoTag //Returns vector case E24XX: return eep24xx_map; break; case E24XX1_A: return eep24xx1A_map; break; case E24XX1_B: return eep24xx1B_map; break; case E24XX2: return eep24xx2_map; break; case E24XX5: return eep24xx5_map; break; case AT90SXX: return eepAT90_map; break; case AT89SXX: return eepAt89s_map; break; case E93X6: return eep93x6_map; break; case E93XX_8: return eep93xx8_map; break; case PIC16XX: return eepPic16_map; break; case PIC168XX: return eepPic168xx_map; break; case PIC125XX: return eepPic125_map; break; case E250XX: return eep250xx_map; break; case E25XXX: return eep25xxx_map; break; case E2506XX: return eep2506_map; break; case ENVMXXX: return eepnvm3060_map; break; case AT17XXX: return eep17xxx_map; break; case X24C44XX: return eep2444_map; break; default: return QVector(); break; } } #if 0 long GetEEPTypeFromSize(int pritype, int size) { QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } for (int j = 0; j < mp.count(); j++) { if (mp.at(j).sz == size) { return mp.at(j).id; } } return -1; } #endif long GetEEPTypeFromSize(unsigned long type, int size) { int pritype = GetE2PPriType(type); QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } for (int j = 0; j < mp.count(); j++) { if (mp.at(j).sz == size) { return mp.at(j).id; } } return -1; } #if 0 int GetEEPTypeSize(int pritype, int subtype) { if (pritype == 0) { return 0; } QVector mp = GetMap(pritype); if (mp.count() == 0) { return 0; } chipInfo i = GetChipInfo(mp, subtype); return i.sz; } #endif int GetEEPTypeSize(unsigned long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); if (pritype == 0) { return 0; } QVector mp = GetMap(pritype); if (mp.count() == 0) { return 0; } chipInfo i = GetChipInfo(mp, subtype); return i.sz; } //Serve solamente nei bus che utilizzano la dimensione // di word degli indirizzi dinamica (per es. Microwire) #if 0 int GetEEPAddrSize(int pritype, int subtype) { QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.adrsz; } #endif int GetEEPAddrSize(unsigned long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.adrsz; } #if 0 int GetEEPTypeSplit(int pritype, int subtype) { QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.splt; } #endif int GetEEPTypeSplit(unsigned long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.splt; } #if 0 int GetEEPTypeWPageSize(int pritype, int subtype) { QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.wpgsz; } #endif int GetEEPTypeWPageSize(unsigned long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); QVector mp = GetMap(pritype); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, subtype); return i.wpgsz; } QVector GetEEPSubTypeVector(int type) { QVector mp = GetMap(type); return mp; } int GetEEPSubTypeIndex(long type) { QVector mp = GetEEPSubTypeVector(GetE2PPriType(type)); if (mp.count() == 0) { return -1; } chipInfo i = GetChipInfo(mp, type); return i.id; } #if 0 QString GetEEPTypeString(int pritype, int subtype) { QVector mp = GetMap(pritype); if (mp.count()) { qDebug() << "mp" << mp.count(); foreach (chipInfo i, mp) { if ((i.id & 0x07fff) == subtype) { return i.name; } } } return ""; } #endif QString GetEEPTypeString(unsigned long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); QVector mp = GetMap(pritype); if (mp.count()) { foreach (chipInfo i, mp) { if ((i.id & 0x07fff) == subtype) { return i.name; } } } return ""; } //18/10/98 #if 0 QString GetEEPTypeString(long type) { int pritype = GetE2PPriType(type); int subtype = GetE2PSubType(type); qDebug() << "GetEEPTypeString" << pritype << subtype << GetEEPTypeString(pritype, subtype); return GetEEPTypeString(pritype, subtype); } #endif /** long GetEEPTypeFromString(char const *name) { char const **rp; long *vp; long ret_type = 0; int k; for (k = 0; k < NO_OF_EEPTYPE; k++) { long new_type = CbxIdToType(k, 0); if (new_type > 0) { vp = GetEEPSubTypeVector( GetE2PPriType(new_type) ); rp = GetEEPSubTypeList( GetE2PPriType(new_type) ); if (rp && vp) { int j; for (j = 0; rp[j] != 0; j++) if (strcasecmp(rp[j], name) == 0) break; if (rp[j]) { ret_type = vp[j]; break; } } } } return ret_type; } **/ tmp9balx013/SrcPony/spi-bus.h0000644000175000017500000000642513616566001016065 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _SPIBUS_H #define _SPIBUS_H #include "busio.h" #include "pgminter.h" class SPIBus : public BusIO { public: SPIBus(BusInterface *ptr = 0, bool cpha = false, bool cpol = false); virtual ~SPIBus(); virtual int Reset(); void SetDelay(); void SetFallingPhase(bool cpha) { m_cpha = cpha; } bool GetFallingPhase() { return m_cpha; } void SetClockPolarity(bool cpol) { m_cpol = cpol; } bool GetClockPolarity() { return m_cpol; } void SetMode(int mode) { m_cpol = ((mode & SPIMODE_CPOL) != 0); m_cpha = ((mode & SPIMODE_CPHA) != 0); } void SetMode(bool cpha, bool cpol) { m_cpol = cpol; m_cpha = cpha; } int GetMode() { int mode = 0; if (m_cpol) { mode |= SPIMODE_CPOL; } if (m_cpha) { mode |= SPIMODE_CPHA; } return mode; } protected: int SendDataByte(int by); int RecDataByte(); void SetReset() { busI->SetControlLine(1); } void ClearReset() { busI->SetControlLine(0); } void setSCK() { busI->SetClock(1); } void clearSCK() { busI->SetClock(0); } int SendDataBit(int b); int RecDataBit(); private: void bitMOSI(int b) { busI->SetDataOut(b); } void setMOSI() { busI->SetDataOut(1); } void clearMOSI() { busI->SetDataOut(0); } int getMISO() const { return busI->GetDataIn(); } bool m_cpol; //clock polarity bool m_cpha; //rising edge vs fall edge sample }; #endif tmp9balx013/SrcPony/progoption.h0000644000175000017500000000512513616566001016677 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef progOPTION_H #define progOPTION_H #include #include #include #include #include #include "ui_progoption.h" #include "e2cmdw.h" // TODO to check modal class progOptionDialog : public QDialog, public cTranslator, public Ui::ProgOptDialog { Q_OBJECT public: progOptionDialog(QWidget *bw, long type, int &reload, int &reep, int &erase, int &flash, int &eeprom, int &lock, const QString title = translate(STR_MSGPROGOPT)); virtual ~progOptionDialog(); // Destructor private slots: void onOk(); protected: private: void setTextWidgets(); private: QVector chk; e2CmdWindow *cmdw; }; #endif tmp9balx013/SrcPony/at17xxx.h0000644000175000017500000000461513616566001016026 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT17XXX_H #define _AT17XXX_H #include "e24xx.h" class At17xxx : public E24xx { public: At17xxx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); // int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: int WritePage(long addr, int addr_bytes, uint8_t *buf, int len); int ReadPage(long addr, int addr_bytes, uint8_t *buf, int len); private: }; #endif tmp9balx013/SrcPony/microbus.h0000644000175000017500000000612313616566001016321 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _MICROBUS_H #define _MICROBUS_H #include "busio.h" #include "pgminter.h" #define ORG8 8 #define ORG16 16 class MicroWireBus : public BusIO { public: MicroWireBus(BusInterface *ptr = nullptr); virtual ~MicroWireBus(); //long Read(int addr, uint8_t *data, long length); //long Write(int addr, uint8_t const *data, long length); int Reset(); virtual int CalcAddressSize(int mem_size) const; void SetDelay(); protected: int SendDataWord(int wo, int wlen, bool lsb = false); int RecDataWord(int wlen, bool lsb = false); int RecDataWordShort(int wlen, bool lsb = false); int WaitReadyAfterWrite(long timeout = 50000); int SendAddress(int addr, int alen) { return SendDataWord(addr, alen); } void SetReset() { busI->SetControlLine(1); } void ClearReset() { busI->SetControlLine(0); } private: int SendDataBit(int b); int RecDataBit(); int RecDataBitShort(); void bitDI(int b) { busI->SetDataOut(b); } void setDI() { busI->SetDataOut(1); } void clearDI() { busI->SetDataOut(0); } void setCLK() { busI->SetClock(1); } void clearCLK() { busI->SetClock(0); } int getDO() const { return busI->GetDataIn(); } }; #endif tmp9balx013/SrcPony/linuxsysfsint.h0000644000175000017500000000525413616566001017444 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _LINUXSYSFSINTERFACE_H #define _LINUXSYSFSINTERFACE_H #include "businter.h" class LinuxSysFsInterface : public BusInterface { public: LinuxSysFsInterface(); virtual ~LinuxSysFsInterface(); virtual int Open(int com_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn(); virtual int GetClock(); virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP(); virtual int IsClockDataDOWN(); //virtual int TestPort(int port); int SetPower(bool onoff); void SetControlLine(int res = 1); protected: //int GetPresence() const; private: int InitPins(int idx); void DeInitPins(); int fd_ctrl; int fd_datain; int fd_dataout; int fd_clock; }; #endif tmp9balx013/SrcPony/interfconv.h0000644000175000017500000000561113616566001016654 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef INTERFCONV_H #define INTERFCONV_H #include "globals.h" enum { FTDI_PORTA = 0, FTDI_PORTB, FTDI_PORTC, FTDI_PORTD }; struct InterfPins { int ctrl; int datain; int dataout; int clock; int clockin; int poweron; int enbus; int ctrlin; }; enum { //Directly correspond to setup interface dialog tab index INTERF_USB = 0, INTERF_COM, INTERF_LPT, INTERF_GPIO }; extern QStringList GetInterfList(int vector); extern HInterfaceType NameToInterfType(const QString &name); extern QString TypeToInterfName(HInterfaceType type); extern int TypeToInterfVector(HInterfaceType type); extern int TypeToInterfIndex(HInterfaceType type); extern HInterfaceType VindexToInterfType(int vector, int index); extern bool TypeToInterfVidPid(HInterfaceType type, unsigned int &vid, unsigned int &pid); extern VidPid TypeToInterfVidPid(HInterfaceType type); extern bool TypeToInterfPins(HInterfaceType type, InterfPins &pins); extern int TypeToInterfPort(HInterfaceType type); #endif // INTERFCONV_H tmp9balx013/SrcPony/eeptypes.h0000644000175000017500000002314413616566001016336 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _EEPTYPES_H #define _EEPTYPES_H #include "globals.h" #include #include // #include #define EID_INVALID 0 #define E24XX 0x01 // Sub types #define E2400 0x010000 #define E2402 0x010001 #define E2404 0x010002 #define E2408 0x010004 #define E2416 0x010008 #define E24XX2 0x02 // Sub types #define E24000 0x020000 #define E24E16 0x020008 #define E2432 0x020010 #define E2464 0x020020 #define E24128 0x020040 #define E24256 0x020080 #define E24512 0x020100 #define AT90SXX 0x03 // Sub types #define AT90S0000 0x030000 #define AT90S1200 0x030002 #define AT90S2313 0x030003 #define AT90S4414 0x030004 #define AT90S8515 0x030005 #define ATmega603 0x030008 #define ATmega103 0x030009 #define AT90S2323 0x03000A #define AT90S2343 0x03000B #define AT90S2333 0x03000C #define AT90S4433 0x03000D #define AT90S4434 0x03000E #define AT90S8534 0x03000F #define AT90S8535 0x030010 #define ATtiny22 0x030011 #define ATtiny12 0x030012 #define ATtiny13 0x030013 #define ATtiny15 0x030014 #define ATmega8515 0x030015 #define ATmega8535 0x030016 #define ATmega8 0x03001A #define ATmega161 0x030020 #define ATmega163 0x030021 #define ATmega16 0x030022 #define ATmega323 0x030023 #define ATmega32 0x030024 #define ATmega162 0x030025 #define ATmega169 0x030026 #define ATmega164 0x030027 #define ATmega324 0x030028 #define ATmega644 0x030029 #define ATmega64 0x03002A #define ATmega128 0x030030 #define ATmega48 0x030031 #define ATmega88 0x030032 #define ATmega168 0x030033 #define ATmega640 0x030034 #define ATmega1280 0x030035 #define ATmega1281 0x030036 #define ATmega2560 0x030037 #define ATmega2561 0x030038 #define ATmega328 0x030039 // new (RG 22.06.2012) #define ATmega1284 0x03003A // new (RG 10.06.2017) #define ATtiny11 0x030080 #define ATtiny10 0x030081 #define ATtiny28 0x030082 #define ATtiny26 0x030083 #define ATtiny2313 0x030084 #define ATtiny25 0x030085 #define ATtiny45 0x030086 #define ATtiny85 0x030087 #define ATtiny261 0x030088 #define ATtiny461 0x030089 #define ATtiny861 0x03008A #define ATtiny24 0x03008B #define ATtiny44 0x03008C #define ATtiny84 0x03008D #define ATtiny4313 0x03008E // new 16.09.2015 @RG #define AT90CAN32 0x030100 #define AT90CAN64 0x030101 #define AT90CAN128 0x030102 #define E93X6 0x04 // Sub types #define E9300 0x040000 #define E9306 0x040001 #define E9346 0x040004 #define E9356 0x040008 #define E9357 0x040009 #define E9366 0x040010 #define E9376 0x040020 #define E9386 0x040040 #define PIC16XX 0x05 // Sub types #define PIC1600 0x050000 #define PIC1684 0x050001 #define PIC1683 0x050002 #define E250XX 0x06 // Sub types #define E25000 0x060000 #define E25010 0x060001 #define E25020 0x060002 #define E25040 0x060004 #define E2506XX 0x07 // Sub types #define E250600 0x070000 #define E2506 0x070001 #define E24XX5 0x08 // Sub types #define E24325 0x080010 #define E24645 0x080020 #define E25XXX 0x09 // Sub types #define E25XX0 0x090000 #define E25080 0x090004 #define E25160 0x090008 #define E25320 0x090010 #define E25640 0x090020 #define E25128 0x090040 #define E25256 0x090080 #define AT89SXX 0x0A // Sub types #define AT89S0000 0x0A0000 #define AT89S8252 0x0A0002 #define AT89S8253 0x0A0003 #define AT89S53 0x0A0004 #define AT89S52 0x0A0005 #define AT89S51 0x0A0006 #define PIC168XX 0x0B // Sub types #define PIC16800 0x0B0000 #define PIC1684A 0x0B0001 #define PIC16870 0x0B0002 #define PIC16871 0x0B0003 #define PIC16872 0x0B0004 #define PIC16873 0x0B0005 #define PIC16874 0x0B0006 #define PIC16876 0x0B0008 #define PIC16877 0x0B0009 #define PIC16873A 0x0B000A #define PIC16874A 0x0B000B #define PIC16876A 0x0B000C #define PIC16877A 0x0B000D #define PIC16627 0x0B0020 #define PIC16628 0x0B0021 #define ENVMXXX 0x0C // Sub types #define ENVM3000 0x0C0000 #define EMDA2061 0x0C0002 #define EMDA2062 0x0C0003 #define ENVM3060 0x0C0004 #define E93XX_8 0x0D // Sub types #define E9300_8 0x0d0000 #define E9306_8 0x0d0001 #define E9346_8 0x0d0004 #define E9356_8 0x0d0008 #define E9357_8 0x0d0009 #define E9366_8 0x0d0010 #define E9376_8 0x0d0020 #define E9386_8 0x0d0040 #define PIC125XX 0x0E // Sub types #define PIC12500 0x0E0000 #define PIC12508 0x0E0004 #define PIC12509 0x0E0005 #define PIC12508A 0x0E0008 #define PIC12509A 0x0E0009 #define PIC12E518 0x0E0010 #define PIC12E519 0x0E0011 #define PIC12608 0x0E0024 #define PIC12609 0x0E0025 #define PIC12608A 0x0E0026 #define PIC12609A 0x0E0027 #define PIC12671 0x0E0030 #define PIC12672 0x0E0031 #define PIC12673 0x0E0032 #define PIC12674 0x0E0033 //#define PIC162XX 0x0F // Sub types //#define PIC16200 0x0F0000 //#define PIC1627 0x0F0004 //#define PIC1628 0x0F0005 #define X24C44XX 0x10 // Sub types #define S24H30 0x100001 #define X24C44 0x100002 #define X24C45 0x100003 #define E24XX1_A 0x11 // Sub types #define E2401_A 0x110001 #define AT17XXX 0x12 // Sub types #define AT1765 0x120002 #define AT17128 0x120003 #define AT17256 0x120004 #define AT17512 0x120005 #define AT17010 0x120006 #define E24XX1_B 0x13 // Sub types #define E2401_B 0x130001 #define NO_OF_EEPTYPE 0x13 #define MAXEEPSUBTYPE 64 #define KB(x) ((x) * 1024) // EK 2017 // common structure for chips struct chipInfo { QString name; long id; // pretype | subtype int sz; //dimensione in numero di banchi int splt; // split int wpgsz; // page size int adrsz; //dimensione dello spazio di indirizzamento in numero di banchi }; // extern long BuildE2PType(int pritype, int subtype = 0); extern long BuildE2PType(unsigned long type); extern int GetE2PSubType(unsigned long type); extern int GetE2PPriType(unsigned long type); chipInfo GetChipInfo(QVector &c, long subtype); // extern QString GetEEPTypeString(int pritype, int subtype); extern QString GetEEPTypeString(unsigned long type); extern int GetEEPTypeIndex(int type); // extern QStringList GetEEPSubTypeList(int type); extern QVector GetEEPSubTypeVector(int type); extern int GetEEPSubTypeIndex(unsigned long type); // extern int GetEEPTypeSize(int pritype, int subtype); extern int GetEEPTypeSize(unsigned long type); // extern int GetEEPAddrSize(int pritype, int subtype); extern int GetEEPAddrSize(unsigned long type); // extern int GetEEPTypeSplit(int pritype, int subtype); extern int GetEEPTypeSplit(unsigned long type); // extern long GetEEPTypeFromSize(int pritype, int size); extern long GetEEPTypeFromSize(unsigned long type, int size); extern long GetEEPTypeFromString(const QString &name); // extern int GetEEPTypeWPageSize(int pritype, int subtype); extern int GetEEPTypeWPageSize(unsigned long type); #endif tmp9balx013/SrcPony/pgminter.cpp0000644000175000017500000001624113616566001016660 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "pgminter.h" #include "errcode.h" #include "e2cmdw.h" #include class e2CmdWindow; SIProgInterface::SIProgInterface() : RS232Interface() { //qDebug() << "SIProgInterface::SIProgInterface()"; //DeInstall(); //old_portno = GetInstalled(); } //SIProgInterface::~SIProgInterface() //{ //} //se res == 1 abilita il BREAK --> Tx = +12v // altrimenti disabilita il BREAK --> Tx = -12v void SIProgInterface::SetControlLine(int res) { if (IsInstalled()) { if (cmdWin->GetPolarity() & RESETINV) { res = !res; } SetSerialBreak(res); } } //La alimentazione e` data dalle tre linee: SCL, SDA, RESET. // Se una qualsiasi di queste tre linee e` a 1 vi e` alimentazione int SIProgInterface::SetPower(bool onoff) { if (onoff) { SetControlLine(1); //SetClockData(); //29/05/98 non funziona la verifica subito dopo la scrittura delle 93Cx6 } else { ClearClockData(); SetControlLine(0); } return OK; } int SIProgInterface::Open(int com_no) { qDebug() << "SIProgInterface::Open(" << com_no << ") IN *** Inst=" << IsInstalled(); int ret_val = OK; if (GetInstalled() != com_no) { if ((ret_val = RS232Interface::OpenSerial(com_no)) == OK) { // SetSerialEventMask(0); //SetPower(true); //08/02/1998 -- ora diamo alimentazione prima di ogni operazione e la togliamo subito dopo Install(com_no); } } qDebug() << "SIProgInterface::Open() = " << ret_val << " OUT"; return ret_val; } void SIProgInterface::Close() { qDebug() << "SIProgInterface::Close() IN *** Inst=" << IsInstalled(); if (IsInstalled()) { SetPower(false); //SetCommMask(hCom, old_mask); DeInstall(); RS232Interface::CloseSerial(); } qDebug() << "SIProgInterface::Close() OUT"; } void SIProgInterface::SetDataOut(int sda) { // qDebug() << "SIProgInterface::SetDataOut(" << sda << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & DOUTINV) { sda = !sda; } SetSerialDTR(sda); } } void SIProgInterface::SetClock(int scl) { // qDebug() << "SIProgInterface::SetClock(" << scl << ") *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & CLOCKINV) { scl = !scl; } SetSerialRTS(scl); } } void SIProgInterface::SetClockData() { // qDebug() << "SIProgInterface::SetClockData() *** Inst=" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); if ((control & CLOCKINV) && (control & DOUTINV)) { SetSerialRTSDTR(0); } else if (!(control & CLOCKINV) && !(control & DOUTINV)) { SetSerialRTSDTR(1); } else { if (control & CLOCKINV) { SetSerialRTS(0); SetSerialDTR(1); } else { SetSerialRTS(1); SetSerialDTR(0); } } } } void SIProgInterface::ClearClockData() //aggiunto il 06/03/98 { // qDebug() << "SIProgInterface::ClearClockData() *** Inst=%" << IsInstalled(); if (IsInstalled()) { unsigned int control = cmdWin->GetPolarity(); if ((control & CLOCKINV) && (control & DOUTINV)) { SetSerialRTSDTR(1); } else if (!(control & CLOCKINV) && !(control & DOUTINV)) { SetSerialRTSDTR(0); } else { if (control & CLOCKINV) { SetSerialRTS(1); SetSerialDTR(0); } else { SetSerialRTS(0); SetSerialDTR(1); } } } } int SIProgInterface::GetDataIn() { // qDebug() << "SIProgInterface::GetDataIn() *** Inst=" << IsInstalled(); if (IsInstalled()) { if (cmdWin->GetPolarity() & DININV) { return !GetSerialCTS(); } else { return GetSerialCTS(); } } else { return E2ERR_NOTINSTALLED; } } int SIProgInterface::GetClock() { return 1; } int SIProgInterface::IsClockDataUP() { // qDebug() << "SIProgInterface::GetSCLSDAup() *** Inst=" << IsInstalled(); return GetDataIn(); } int SIProgInterface::IsClockDataDOWN() { // qDebug() << "SIProgInterface::GetSCLSDAdown() *** Inst=" << IsInstalled(); return !GetDataIn(); } int SIProgInterface::TestPort(int com_no) { qDebug() << "SIProgInterface::TestPort(" << com_no << ") IN"; int ret_val = TestSave(com_no); if (ret_val == OK) { ret_val = E2ERR_OPENFAILED; SetPower(false); w.WaitMsec(100); SetSerialRTS(true); w.WaitMsec(50); if (GetSerialDSR()) { SetSerialRTS(false); w.WaitMsec(50); if (!GetSerialDSR()) { SetSerialRTS(true); w.WaitMsec(50); if (GetSerialDSR()) { ret_val = OK; } } } SetPower(false); } TestRestore(); qDebug() << "SIProgInterface::TestPort() = " << ret_val << " OUT"; return ret_val; } /*** //Salva le porte attuali ed apre una nuova seriale (per Test) int SIProgInterface::TestSave(int port_no) { qDebug() << "SIProgInterface::TestSave(" << port_no<< ") IN"; int ret_val; old_portno = IsInstalled(); Close(); if ( (ret_val = Open(port_no)) == OK ) { } qDebug() << "SIProgInterface::TestSave() = "<< ret_val<<" OUT"; return ret_val; } //Ripristina la situazione precedente a TestSave() void SIProgInterface::TestRestore() { qDebug() << "SIProgInterface::TestRestore() IN *** Inst="<< IsInstalled(); if (IsInstalled()) { Close(); } if (old_portno) { Open(old_portno); } old_portno = 0; qDebug() << "SIProgInterface::TestRestore() OUT"; } ***/ tmp9balx013/SrcPony/e2app.cpp0000644000175000017500000003267513616566001016053 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "e2profil.h" #include "e2awinfo.h" #include "e2app.h" // Header file #include #include #include #include #ifdef Q_OS_LINUX #include #include #include #endif #include "microbus.h" #include "interfconv.h" //const int idAskToSave = 100; // Dummy Command e2App::e2App() : awip(0), port_number(0) { // Constructor qDebug() << Q_FUNC_INFO; // awinfo = 0; s2430B.SetOrganization(ORG8); //Default X2444Bus organization is ORG16, but S24H30 organization is ORG8 // mega103B.SetPageSize(256); // mega103B.SetFlashPagePolling(false); // atMegaB.SetPageSize(256); // atMegaB.SetFlashPagePolling(true); // mega16xB.SetPageSize(128); // mega16xB.SetFlashPagePolling(true); // mega8xB.SetPageSize(64); // mega8xB.SetFlashPagePolling(true); // tiny2xB.SetPageSize(32); // tiny2xB.SetFlashPagePolling(true); //AutoTag //Initialize Bus Pointers vector busvetp[I2C - 1] = &iicB; busvetp[AT90S - 1] = &at90sB; //busvetp[ATMEGAB-1] = &atMegaB; //busvetp[AT1200S-1] = &at1200B; busvetp[AT89S - 1] = &at89sB; busvetp[AT93C - 1] = &at93cB; busvetp[AT250 - 1] = &at250B; busvetp[AT250BIG - 1] = &at250BigB; busvetp[PICB - 1] = &picB; busvetp[PIC12B - 1] = &pic12B; //busvetp[SXB - 1] = &sxB; busvetp[SDEB - 1] = &sdeB; busvetp[PICNEWB - 1] = &picNewB; busvetp[IMBUS - 1] = &imB; busvetp[X2444B - 1] = &x2444B; busvetp[S2430B - 1] = &s2430B; //duplicated call in initSettings() //SetInterfaceType(); //Set default interface initSettings(); } e2App::~e2App() { qDebug() << Q_FUNC_INFO; } void e2App::initSettings() { QString str; qDebug() << "Settings file: " << E2Profile::GetConfigFile(); // << " - Format: " << E2Profile::s->format(); QString currentAppDir = qApp->applicationDirPath(); helpfile = currentAppDir + "/ponyprog.html"; ok_soundfile = currentAppDir + "/oksound.wav"; err_soundfile = currentAppDir + "/errsound.wav"; QString sp2 = E2Profile::GetLanguageCode(); if (sp2.length() > 0) { str = sp2; E2Profile::SetLanguageCode(str.toLatin1()); if (str == "default") { sp2 = ""; } else if (str == "locale") { sp2 = translate(STR_LANGUAGE_CODE); } else { sp2 = str; } setlocale(LC_ALL, sp2.toLatin1()); } // Read parameters from INI file SetInterfaceType(E2Profile::GetParInterfType()); SetPort(E2Profile::GetPortNumber()); SetPolarity(E2Profile::GetPolarityLines()); #if 0 // Make sure all parameters (even default values) are written // to the INI file. E2Profile::GetPowerUpDelay(); E2Profile::GetSPIResetPulse(); E2Profile::GetSPIDelayAfterReset(); E2Profile::GetSPIPageWrite(); E2Profile::GetMegaPageDelay(); E2Profile::GetAVRProgDelay(); E2Profile::GetAVREraseDelay(); E2Profile::GetAT89DelayAfterReset(); E2Profile::GetAVRDelayAfterReset(); // E2Profile::GetI2CSpeed(); E2Profile::GetSPISpeed(); E2Profile::GetMicroWireSpeed(); E2Profile::GetPICSpeed(); E2Profile::GetSDESpeed(); // E2Profile::GetLogEnabled(); E2Profile::GetSoundEnabled(); E2Profile::GetSkipStartupDialog(); E2Profile::GetVerifyAfterWrite(); E2Profile::GetClearBufBeforeLoad(); E2Profile::GetClearBufBeforeRead(); E2Profile::GetAutoDetectPorts(); E2Profile::GetAt89PageOp(); E2Profile::Get8253FallEdge(); #ifdef Q_OS_LINUX E2Profile::GetLockDir(); E2Profile::GetDevDir(); #endif E2Profile::GetDevName(); #endif scriptMode = false; returnValue = 0; script_name = ""; } //=====================>>> e2App::OpenPort <<<============================== int e2App::OpenPort(int port) { qDebug() << Q_FUNC_INFO << "(" << port << ")"; if (port >= 0) { SetPort(port); } ClosePort(); return iniBus->Open(GetPort()); } //=====================>>> e2App::ClosePort <<<============================== void e2App::ClosePort() { qDebug() << Q_FUNC_INFO << " iniBus=" << (hex) << iniBus << (dec); iniBus->Close(); } //=====================>>> e2App::TestPort <<<============================== int e2App::TestPort(int port, bool open_only) { qDebug() << Q_FUNC_INFO << "(port=" << port << ", open_only=" << open_only << ")"; int rv = (open_only) ? busIntp->TestOpen(port) : busIntp->TestPort(port); qDebug() << Q_FUNC_INFO << " = " << rv; return rv; } //=====================>>> e2App::OpenBus <<<============================== int e2App::OpenBus(BusIO *p) { qDebug() << Q_FUNC_INFO << "(" << (hex) << p << (dec) << ")"; iniBus->Close(); qDebug() << Q_FUNC_INFO << " ** Close"; iniBus = p; int rv = iniBus->Open(GetPort()); qDebug() << Q_FUNC_INFO << " ** Open = " << rv; if (rv == OK) { rv = busIntp->SetPower(true); qDebug() << Q_FUNC_INFO << " ** SetPower"; //Power up delay busIntp->WaitMsec(E2Profile::GetPowerUpDelay()); qDebug() << Q_FUNC_INFO << " ** Reset"; iniBus->Reset(); //28/10/98 } qDebug() << Q_FUNC_INFO << " = " << rv; return rv; } //=====================>>> e2App::SleepBus <<<============================== void e2App::SleepBus() { qDebug() << Q_FUNC_INFO << " iniBus=" << (hex) << iniBus << (dec); busIntp->WaitMsec(5); // 08/04/98 -- power hold time busIntp->SetPower(false); iniBus->Close(); // 28/09/98 -- richiude la porta dopo averla usata } // EK 2017 // TODO to remove this to init function #if 0 //=====================>>> e2App::NewAppWin <<<========================== vWindow *e2App::NewAppWin(vWindow *win, char *name, int w, int h, vAppWinInfo *winInfo) { #ifdef Q_OS_WIN32 // Yes it's a dirty hack here but clean in Windows sense, heha 130406 HKEY key; // But I wouldn't change the very incomplete V-lib source. if (!RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\h#s\\PonyProg", 0, KEY_QUERY_VALUE, &key)) { WINDOWPLACEMENT wp; wp.length = sizeof wp; HWND w = theApp->winHwnd(); if (GetWindowPlacement(w, &wp)) { DWORD size = sizeof wp.rcNormalPosition; if (!RegQueryValueEx(key, "WinPos", NULL, NULL, (LPBYTE)&wp.rcNormalPosition, &size) && size == sizeof wp.rcNormalPosition) { SetWindowPlacement(w, &wp); } } RegCloseKey(key); } #endif vWindow *thisWin = win; //local copy to use vAppWinInfo *awinfo = winInfo; char *appname = name; if (!*name) { appname = "No Name"; // Default name } qDebug() << "e2App::NewAppWin(" << appname << ")"; // Create the first window using provided CmdWindow winCounter++; //incremente il numero di finestre if (!thisWin) //need to new a window { thisWin = new e2CmdWindow(appname, w, h); } if (!awinfo) { awinfo = new e2AppWinInfo((vCmdWindow *)thisWin, name, busvetp); } return vApp::NewAppWin(thisWin, appname, w, h, awinfo); } #endif int e2App::Calibration() { qDebug() << Q_FUNC_INFO; int rv = OK; // OpenBus(&iicB); //aggiunto il 06/03/98 LookForBogoMips(); // rv = iicB.Calibration(); // SleepBus(); //aggiunto il 06/03/98 return rv; } void e2App::SetInterfaceType(HInterfaceType type) { switch (type) { //Interface initializers case SIPROG_IO: iType = SIPROG_IO; busIntp = &siprog_ioI; break; case EASYI2C_API: iType = EASYI2C_API; busIntp = &easyi2c_apiI; easyi2c_apiI.SetIOmode(false); easyi2c_apiI.Close(); break; case EASYI2C_IO: iType = EASYI2C_IO; busIntp = &easyi2c_ioI; easyi2c_ioI.SetIOmode(true); easyi2c_ioI.Close(); break; case AVRISP: iType = AVRISP; busIntp = &avrisp_apiI; avrisp_apiI.SetIOmode(false); avrisp_apiI.Close(); break; case AVRISP_IO: iType = AVRISP_IO; busIntp = &avrisp_ioI; avrisp_ioI.SetIOmode(true); avrisp_ioI.Close(); break; case JDM_API: iType = JDM_API; busIntp = &jdm_apiI; jdm_apiI.SetCmd2CmdDelay(E2Profile::GetJDMCmd2CmdDelay()); break; case DT006_API: iType = DT006_API; busIntp = &dt006_apiI; dt006_apiI.SetIOmode(false); dt006_apiI.Close(); break; case DT006_IO: iType = DT006_IO; busIntp = &dt006_ioI; dt006_ioI.SetIOmode(true); dt006_ioI.Close(); break; case LINUXSYSFS_IO: iType = LINUXSYSFS_IO; busIntp = &linuxsysfs_ioI; break; case FTDI_JTAGKEY: iType = FTDI_JTAGKEY; busIntp = &jtagkeyI; break; case PONYPROG_FT: iType = PONYPROG_FT; busIntp = &ponyprog_ftI; break; case SIPROG_API: default: //20/07/99 -- to prevent crash iType = SIPROG_API; busIntp = &siprog_apiI; break; } busIntp->SetUSBVidPid(TypeToInterfVidPid(iType)); InterfPins pins; E2Profile::GetInterfacePins(iType, pins); busIntp->ConfigPins(pins); for (int k = 0; k < NO_OF_BUSTYPE; k++) { busvetp[k]->SetBusInterface(busIntp); } } #ifdef __unix__ static volatile int alarm_caught; static void alarm(int i) { (void)i; alarm_caught = 1; } #endif #define N_SAMPLE 4 #define N_CICLI 8000 #define UDELAY 40 #define MSLICE ((float)UDELAY * N_CICLI / 1000.0) void e2App::LookForBogoMips() { #ifdef __unix__ struct itimerval it; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = 0; it.it_value.tv_usec = 500000; signal(SIGALRM, alarm); long ndel[N_SAMPLE]; int k; for (k = 0; k < N_SAMPLE; k++) { setitimer(ITIMER_REAL, &it, NULL); alarm_caught = 0; long j = 0; while (!alarm_caught) { j++; } ndel[k] = j; // fprintf(stderr, "** %ld\n", j); } long sum = 0; for (k = 0; k < N_SAMPLE; k++) { sum += ndel[k]; } E2Profile::SetBogoMips((int)(sum / (500 * N_SAMPLE))); #else DWORD t0; DWORD count; DWORD multiplier = 1; QString strbuf; QFileInfo fi(E2Profile::GetConfigFile()); if (fi.exists()) { strbuf = fi.canonicalPath(); } else { strbuf = qApp->applicationDirPath(); } strbuf.append("/bogomips.out"); QFile fh(strbuf); if (!fh.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } QTextStream out(&fh); Wait w; int k; w.SetHwTimer(0); //Disable Hw timer for bogomips calibration // First BogoMIPS evaluation do { multiplier *= 5; E2Profile::SetBogoMips(700 * multiplier); w.SetBogoKips(); t0 = GetTickCount(); for (k = 0; k < N_CICLI / 10; k++) { w.WaitUsec(UDELAY); } count = GetTickCount() - t0; out << "bogo = " << E2Profile::GetBogoMips() << ", count =" << count << "\n"; } while (count <= MSLICE / 11); t0 = GetTickCount(); for (k = 0; k < N_CICLI; k++) { w.WaitUsec(UDELAY); } count = GetTickCount() - t0; out << "1) count = " << count << " ** mslice = " << MSLICE << " *** bogo = " << E2Profile::GetBogoMips() << "\n"; int j; //Fast correction for (j = 0; count > (MSLICE * 1.01) && j < 10; j++) { int nv; nv = (DWORD)((float) E2Profile::GetBogoMips() * (MSLICE / (float)count) + 0.5); E2Profile::SetBogoMips(nv); w.SetBogoKips(); t0 = GetTickCount(); for (k = 0; k < N_CICLI; k++) { w.WaitUsec(UDELAY); } count = GetTickCount() - t0; out << "2) count = " << count << " ** mslice = " << MSLICE << " *** bogo = " << E2Profile::GetBogoMips() << "\n"; } //Fine correction for (j = 0; count < (MSLICE * 0.99) && j < 10; j++) { int nv; nv = (DWORD)((float) E2Profile::GetBogoMips() * 1.01 + 0.5); E2Profile::SetBogoMips(nv); w.SetBogoKips(); t0 = GetTickCount(); for (k = 0; k < N_CICLI; k++) { w.WaitUsec(UDELAY); } count = GetTickCount() - t0; out << "3) count = " << count << " ** mslice = " << MSLICE << " *** bogo = " << E2Profile::GetBogoMips() << "\n"; } w.CheckHwTimer(); //Check to enable again Hw timer if (w.GetHwTimer()) { out << "Hardware timer is OK.\n"; } else { out << "Hardware timer is too slow, use bogomips (" << E2Profile::GetBogoMips() << ")\n"; } fh.close(); #endif } int e2App::LoadDriver(int start) { int rv = OK; (void)start; return rv; } tmp9balx013/SrcPony/errcode.h0000644000175000017500000000755313616566001016131 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _ERRCODE_H #define _ERRCODE_H #define OK 0 #define NOT_READY -1 #define BADPARAM -2 // Parametri alla funzione errati #define FILENOTFOUND -3 // File non aperto in lettura #define CREATEERROR -4 // File non aperto in scrittura #define BADFILETYPE -5 // File di tipo errato #define READERROR -6 // Errore in lettura dal file #define WRITEERROR -7 // Errore in scrittura da file #define NOTHINGTOSAVE -8 // Nessun contenuto da salvare #define NOTSUPPORTED -9 // Funzionalita` non supportata (ancora) #define E2P_TIMEOUT -10 //#define IICERR_NOERR OK #define IICERR_BUSBUSY -11 #define IICERR_NOTACK -12 #define IICERR_NOADDRACK -13 #define IICERR_SDACONFLICT -14 #define IICERR_SCLCONFLICT -15 #define E2ERR_OPENFAILED -16 #define E2ERR_ACCESSDENIED -17 #define E2ERR_NOTINSTALLED -18 #define IICERR_TIMEOUT -19 #define IICERR_STOP -20 #define E2ERR_WRITEFAILED -21 #define E2ERR_BLANKCHECKFAILED -22 #define DEVICE_BADTYPE -23 #define DEVICE_UNKNOWN -24 #define DEVICE_LOCKED -25 #define OP_ABORTED -26 #define BUFFEROVERFLOW -30 #define OUTOFMEMORY -31 #define BUFFERUNDERFLOW -32 #define E2ERR_IOTEST -33 //Codici di errore restituiti dall'interprete di comandi a menu #define CMD_BUFFEREMPTY -39 #define CMD_NOTHINGTOWRITE -40 #define CMD_NOTHINGTOVERIFY -41 #define CMD_NOTHINGTOLOAD -42 #define CMD_NOTHINGTOSAVE -43 #define CMD_WRITEFAILED -44 #define CMD_VERIFYFAILED -45 #define CMD_ROLLOVERFAILED -46 #define CMD_SCRIPTERROR -50 #endif tmp9balx013/SrcPony/at25xxx.cpp0000644000175000017500000000420013616566001016346 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at25xxx.h" // Header file #include "errcode.h" #include "eeptypes.h" At25xxx::At25xxx(e2AppWinInfo *wininfo, BusIO *busp) : At250xx(wininfo, busp) { } At25xxx::~At25xxx() { } tmp9balx013/SrcPony/usbwatcher.cpp0000644000175000017500000001132013616566001017173 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // Copyright (C) 2019 LibUSB part, Eduard Kalinowski // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include "usbwatcher.h" static int LIBUSB_CALL hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, libusb_hotplug_event event, void *user_data) { struct libusb_device_descriptor desc; (void)libusb_get_device_descriptor(dev, &desc); USBWatcher *w = static_cast(user_data); Q_CHECK_PTR(w); if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { w->hotplug_notify(true, desc.idVendor, desc.idProduct); qDebug() << "Connected VID:PID " << (hex) << desc.idVendor << " - " << desc.idProduct; } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { w->hotplug_notify(false, desc.idVendor, desc.idProduct); qDebug() << "Disconnected VID:PID " << (hex) << desc.idVendor << " - " << desc.idProduct; } return 0; } void USBWatcher::doPoll() { if (count > 0) { if (usb_ctx) { struct timeval zero_tv = { .tv_sec = 0, .tv_usec = 0 }; //zero_tv.tv_sec = 1; // timeout 1 sec int rv = libusb_handle_events_timeout_completed(usb_ctx, const_cast(&zero_tv), NULL); if (rv != LIBUSB_SUCCESS) { qWarning() << "libusb_handle_events_timeout_completed() failed: " << rv; } } else { //Don't support hotplug, simulate it with a timer event emit notify(false, 0, 0); } } } USBWatcher::USBWatcher() : cbHandle(0), usb_ctx(0), timer(0), count(0) { vUSB.clear(); } USBWatcher::~USBWatcher() { hotplug_deregister(); } void USBWatcher::hotplug_deregister() { if (count > 0) { if (timer) { timer->stop(); delete timer; } if (usb_ctx) { libusb_hotplug_deregister_callback(usb_ctx, cbHandle); libusb_exit(usb_ctx); usb_ctx = 0; } count--; } } bool USBWatcher::hotplug_register(quint16 vid, quint16 pid) { bool result = false; if (count == 0) { int tval = 1000; libusb_init(&usb_ctx); if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { int rc = libusb_hotplug_register_callback(usb_ctx, (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), LIBUSB_HOTPLUG_ENUMERATE, (vid == 0) ? LIBUSB_HOTPLUG_MATCH_ANY : vid, (pid == 0) ? LIBUSB_HOTPLUG_MATCH_ANY : pid, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, this, &cbHandle); if (LIBUSB_SUCCESS != rc) { libusb_exit(usb_ctx); usb_ctx = 0; } else { tval = 100; result = true; } } else { libusb_exit(usb_ctx); usb_ctx = 0; qWarning() << "NO USB HotPlug capability (simulate it with a timer)"; } QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(doPoll())); timer->start(tval); count++; } return result; } tmp9balx013/SrcPony/linuxsysfsint.cpp0000644000175000017500000002233113616566001017772 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // Linux SysFS IO (useful on raspberry and embedded PC) #include "linuxsysfsint.h" #include "errcode.h" #include "e2cmdw.h" #include #include #include #include #define GPIO_OUT true #define GPIO_IN false #ifdef Q_OS_LINUX # include # include # include #endif LinuxSysFsInterface::LinuxSysFsInterface() { //qDebug() << "LinuxSysFsInterface::LinuxSysFsInterface()"; //DeInstall(); //old_portno = GetInstalled(); fd_ctrl = fd_clock = fd_datain = fd_dataout = -1; } LinuxSysFsInterface::~LinuxSysFsInterface() { Close(); } #ifdef Q_OS_LINUX #define SYSFS_GPIO_DIR "/sys/class/gpio" #define MAX_BUF 64 static int gpio_open(unsigned int gpio, bool out_dir) { // char buf[MAX_BUF]; QString buf; int rval; //trying with gpio command (you need wiringPi installed) buf.sprintf("export %u %s", gpio, out_dir ? "out" : "in"); // rval = system(buf.toLatin1().data()); rval = QProcess::execute("gpio", buf.split(" ")); if (rval != 0) { int fd; fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY); if (fd < 0) { qWarning("Unable to open GPIO export interface: %s\n", strerror(errno)); rval = -1; } else { int ret, len; buf = QString::number(gpio); len = buf.length(); ret = write(fd, buf.toLatin1().data(), len); close(fd); rval = (ret == len) ? 0 : -1; } if (rval == 0) { buf.sprintf("%s/gpio%d/direction", SYSFS_GPIO_DIR, gpio); fd = open(buf.toLatin1().data(), O_WRONLY); if (fd < 0) { qWarning("Unable to open GPIO direction interface: %s\n", strerror(errno)); rval = -1; } else { int ret, len; if (out_dir) { buf = "out"; } else { buf = "in"; } len = buf.length(); ret = write(fd, buf.toLatin1().constData(), len); close(fd); rval = (ret == len) ? 0 : -1; } } } //open the value interace if (rval == 0) { int fd; buf.sprintf("%s/gpio%d/value", SYSFS_GPIO_DIR, gpio); fd = open(buf.toLatin1().data(), out_dir ? O_WRONLY : O_RDONLY); if (fd < 0) { qWarning("Unable to open GPIO set-value interface: %s\n", strerror(errno)); rval = -1; } else { rval = fd; } } qDebug() << "gpio_open(" << gpio << ", " << (out_dir ? "out" : "in") << ") rval = " << rval; return rval; } static int gpio_close(unsigned int gpio, int fd) { // char buf[MAX_BUF]; QString buf; int rval = 0; //close value interface if (fd > 0) { close(fd); } //trying with gpio command (you need wiringPi installed) buf.sprintf("unexport %u", gpio); // rval = system(buf.toLatin1().data()); rval = QProcess::execute("gpio", buf.split(" ")); if (rval != 0) { fd = open(SYSFS_GPIO_DIR "/unexport", O_WRONLY); if (fd < 0) { qWarning("Unable to open GPIO unexport interface: %s\n", strerror(errno)); rval = -1; } else { int ret, len; buf = QString().number(gpio); len = buf.length(); ret = write(fd, buf.toLatin1().data(), len); close(fd); rval = (ret == len) ? 0 : -1; } } qDebug() << "gpio_close(" << gpio << ") rval = " << rval; return rval; } #endif int LinuxSysFsInterface::SetPower(bool onoff) { qDebug() << "LinuxSysFsInterface::SetPower(" << onoff << ")"; return OK; } int LinuxSysFsInterface::InitPins(int idx) { if (pins.ctrl == 0 && pins.clock == 0 && pins.datain == 0 && pins.dataout == 0) { qWarning() << "LinuxSysFsInterface::InitPins() Unconfigured pins"; return E2ERR_OPENFAILED; } qDebug() << "LinuxSysFsInterface::InitPins Ctrl=" << pins.ctrl << ", Clock= " << pins.clock; qDebug() << "DataIn=" << pins.datain << ", DataOut=" << pins.dataout; #ifdef Q_OS_LINUX fd_ctrl = gpio_open(pins.ctrl, GPIO_OUT); fd_clock = gpio_open(pins.clock, GPIO_OUT); fd_datain = gpio_open(pins.datain, GPIO_IN); fd_dataout = gpio_open(pins.dataout, GPIO_OUT); if (fd_ctrl < 0 || fd_clock < 0 || fd_datain < 0 || fd_dataout < 0) { DeInitPins(); return E2ERR_OPENFAILED; } #endif return OK; } void LinuxSysFsInterface::DeInitPins() { #ifdef Q_OS_LINUX gpio_close(pins.ctrl, fd_ctrl); gpio_close(pins.clock, fd_clock); gpio_close(pins.datain, fd_datain); gpio_close(pins.dataout, fd_dataout); fd_ctrl = fd_clock = fd_datain = fd_dataout = -1; #endif } int LinuxSysFsInterface::Open(int port_no) { qDebug() << Q_FUNC_INFO << " (" << port_no << ") IN"; int ret_val = OK; if (GetInstalled() != port_no) { if ((ret_val = InitPins(port_no)) == OK) { Install(port_no); } } qDebug() << Q_FUNC_INFO << " = " << ret_val << " OUT"; return ret_val; } void LinuxSysFsInterface::Close() { qDebug() << Q_FUNC_INFO << " IN"; if (IsInstalled()) { SetPower(false); DeInitPins(); DeInstall(); } qDebug() << Q_FUNC_INFO << " OUT"; } // Per l'AVR e` la linea di RESET void LinuxSysFsInterface::SetControlLine(int res) { qDebug() << Q_FUNC_INFO << " (" << res << ") *** Inst=" << IsInstalled() << ", fd=" << fd_ctrl; if (IsInstalled()) { #ifdef Q_OS_LINUX if (cmdWin->GetPolarity() & RESETINV) { res = !res; } int ret; if (res) { ret = write(fd_ctrl, "1", 2); } else { ret = write(fd_ctrl, "0", 2); } if (ret != 2) { qWarning("LinuxSysFsInterface::SetControlLine() write failed (%d)\n", ret); exit(1); } #endif } } void LinuxSysFsInterface::SetDataOut(int sda) { qDebug() << Q_FUNC_INFO << "(" << sda << ") *** Inst=" << IsInstalled() << ", fd=" << fd_dataout; if (IsInstalled()) { #ifdef Q_OS_LINUX if ((cmdWin->GetPolarity() & DOUTINV)) { sda = !sda; } int ret; if (sda) { ret = write(fd_dataout, "1", 2); } else { ret = write(fd_dataout, "0", 2); } if (ret != 2) { qWarning("LinuxSysFsInterface::SetDataOut() write failed (%d)\n", ret); exit(1); } #endif } } void LinuxSysFsInterface::SetClock(int scl) { qDebug() << Q_FUNC_INFO << "(" << scl << ") *** Inst=" << IsInstalled() << ", fd=" << fd_clock; if (IsInstalled()) { #ifdef Q_OS_LINUX if ((cmdWin->GetPolarity() & CLOCKINV)) { scl = !scl; } int ret; if (scl) { ret = write(fd_clock, "1", 2); } else { ret = write(fd_clock, "0", 2); } if (ret != 2) { qWarning("LinuxSysFsInterface::SetClock() write failed (%d)\n", ret); exit(1); } #endif } } void LinuxSysFsInterface::SetClockData() { qDebug() << Q_FUNC_INFO << " *** Inst=" << IsInstalled(); if (IsInstalled()) { SetClock(1); SetDataOut(1); } } void LinuxSysFsInterface::ClearClockData() { qDebug() << Q_FUNC_INFO << " *** Inst=" << IsInstalled(); if (IsInstalled()) { SetClock(0); SetDataOut(0); } } int LinuxSysFsInterface::GetDataIn() { if (IsInstalled()) { unsigned int val = 0; #ifdef Q_OS_LINUX int ret; char ch; lseek(fd_datain, 0L, SEEK_SET); ret = read(fd_datain, &ch, 1); val = (ch == '0') ? 0 : 1; if (ret < 1) { qWarning("LinuxSysFsInterface::GetDataIn() read failed (%d)\n", ret); exit(1); } qDebug() << Q_FUNC_INFO << "=" << val << ", fd=" << fd_datain; if (cmdWin->GetPolarity() & DININV) { val = !val; } #endif return val; } else { return E2ERR_NOTINSTALLED; } } int LinuxSysFsInterface::GetClock() { return 1; } int LinuxSysFsInterface::IsClockDataUP() { qDebug() << Q_FUNC_INFO << " *** Inst=" << IsInstalled(); return GetDataIn(); } int LinuxSysFsInterface::IsClockDataDOWN() { qDebug() << Q_FUNC_INFO << " *** Inst=" << IsInstalled(); return !GetDataIn(); } tmp9balx013/SrcPony/csmfbuf.h0000644000175000017500000000453213616566001016125 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _CSMFBUF_H #define _CSMFBUF_H // Include standard V files as needed #include "types.h" #include "filebuf.h" #include "device.h" class csmFileBuf : public FileBuf { public: csmFileBuf(e2AppWinInfo *wininfo = 0); // virtual ~csmFileBuf(); virtual int Load(int loadtype = ALL_TYPE, long relocation_offfset = 0); virtual int Save(int savetype = ALL_TYPE, long relocation_offfset = 0); protected: private: }; #endif tmp9balx013/SrcPony/ch341a.h0000644000175000017500000003324313616566001015464 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // https://github.com/lancos/ponyprog // // // // LibUSB implementation for PonyProg (C) 2019 Eduard Kalinowski // // // // sources: // // Copyright (C) 2014 Pluto Yang (yangyj.ee@gmail.com) // // https://github.com/setarcos/ch341prog // // // // Copyright (C) 2016 Eugene Hutorny (eugene@hutorny.in.ua) // // https://github.com/hutorny/usbuart // // // // Copyright (c) 2017 Gunar Schorcht (gunar@schorcht.net) // // https://github.com/gschorcht/spi-ch341-usb // // https://github.com/gschorcht/i2c-ch341-usb // // // // Copyright (c) 2018 Sarim Khan (sarim2005@gmail.com) // // https://github.com/sarim/ch341a-bitbang-userland // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef __CH341_H__ #define __CH341_H__ #include #include #include // #define CONTROL_WRITE_ENDPOINT 0x02 // #define CONTROL_READ_ENDPOINT 0x82 #define MAX_EEPROM_SIZE 131072 /* For 24c1024*/ #define DEFAULT_CONFIGURATION 0x01 #define DEFAULT_TIMEOUT 300 // 300mS for USB timeouts #if 0 #define IN_BUF_SZ 0x100 #define EEPROM_WRITE_BUF_SZ 0x2b // only for 24c64 / 24c32 ?? #define EEPROM_READ_BULKIN_BUF_SZ 0x20 #define EEPROM_READ_BULKOUT_BUF_SZ 0x65 #endif #define CH341_PACKET_LENGTH 0x20 #define CH341_MAX_PACKETS 256 #define CH341_MAX_PACKET_LEN (CH341_PACKET_LENGTH * CH341_MAX_PACKETS) #define CH34x_VENDOR_ID1 0x4348 #define CH34x_VENDOR_ID2 0x1A86 #define CH341A_PRODUCT 0x5512 // for SPI, I2C #define CH341_UART_PRODUCT 0x5523 #define CH340_UART_PRODUCT 0x7523 #if 0 #define CH341A_CMD_SET_OUTPUT 0xA1 #define CH341A_CMD_IO_ADDR 0xA2 #define CH341A_CMD_PRINT_OUT 0xA3 #define CH341A_CMD_SPI_STREAM 0xA8 #define CH341A_CMD_SIO_STREAM 0xA9 #define CH341A_CMD_I2C_STREAM 0xAA #define CH341A_CMD_UIO_STREAM 0xAB #define CH341A_CMD_I2C_STM_STA 0x74 #define CH341A_CMD_I2C_STM_STO 0x75 #define CH341A_CMD_I2C_STM_OUT 0x80 #define CH341A_CMD_I2C_STM_IN 0xC0 #define CH341A_CMD_I2C_STM_MAX ( min( 0x3F, CH341_PACKET_LENGTH ) ) #define CH341A_CMD_I2C_STM_SET 0x60 #define CH341A_CMD_I2C_STM_US 0x40 #define CH341A_CMD_I2C_STM_MS 0x50 #define CH341A_CMD_I2C_STM_DLY 0x0F #define CH341A_CMD_I2C_STM_END 0x00 // GPIO part #define CH341A_CMD_UIO_STM_IN 0x00 #define CH341A_CMD_UIO_STM_DIR 0x40 #define CH341A_CMD_UIO_STM_OUT 0x80 #define CH341A_CMD_UIO_STM_US 0xC0 #define CH341A_CMD_UIO_STM_END 0x20 #define CH341A_STM_I2C_20K 0x00 #define CH341A_STM_I2C_100K 0x01 #define CH341A_STM_I2C_400K 0x02 #define CH341A_STM_I2C_750K 0x03 #define CH341A_STM_SPI_DBL 0x04 #endif /*******************************/ /* baudrate calculation factor */ /*******************************/ #define CH341_BPS_MOD_BASE 20000000 #define CH341_BPS_MOD_BASE_OFS 1100 //Vendor define #define CH341_REQ_WRITE_TYPE 0x40 #define CH341_REQ_READ_TYPE 0xC0 #define CH341_REG_STAT 0x0706 #define CH341_REG_BREAK 0x1805 #define CH341_REG_LCR 0x2518 #define CH341_REG_FLOW_CTRL 0x2727 #define CH341_REG_BAUD1 0x1312 #define CH341_REG_BAUD2 0x0f2c /*is it right, or 0x0f14 ?? */ #define CH341_RESET_VALUE 0x501f /* line mode? */ #define CH341_RESET_INDEX 0xd90a /* baud rate? */ #define CH341_REQ_READ_VERSION 0x5F #define CH341_REQ_WRITE_REG 0x9A #define CH341_REQ_READ_REG 0x95 #define CH341_REQ_SERIAL_INIT 0xA1 #define CH341_REQ_MODEM_CTRL 0xA4 /* DTR and RTS */ // ??? right #define CH341_NBREAK_BITS_REG 0x4001 #define CH341_NBREAK_BITS_REG1 0x01 #define CH341_NBREAK_BITS_REG2 0x40 #define CH341_INPUT_BUF_SIZE 0x08 /* status returned in third interrupt answer byte, inverted in data from irq */ //For CMD 0xA4 CH341_REQ_MODEM_CTRL #define CH341_UART_CTS 0x01 #define CH341_UART_DSR 0x02 #define CH341_UART_RING 0x04 #define CH341_UART_DCD 0x08 #define CH341_BITS_MODEM_STAT 0x0f /* all bits */ #define CH341_MULT_STAT 0x04 /* multiple status since last interrupt event */ #define CH341_CONTROL_OUT 0x10 // TX #define CH341_CONTROL_DTR 0x20 // DTR, 1 << 5 #define CH341_CONTROL_RTS 0x40 // RTS, 1 << 6 //Uart state #define CH341_UART_STATE 0x00 #define CH341_UART_OVERRUN_ERROR 0x01 #define CH341_UART_BREAK_ERROR //no define #define CH341_UART_PARITY_ERROR 0x02 #define CH341_UART_FRAME_ERROR 0x06 #define CH341_UART_RECV_ERROR 0x02 #define CH341_UART_STATE_TRANSIENT_MASK 0x07 // LCR #define CH341_LCR_ENABLE_RX 0x80 #define CH341_LCR_ENABLE_TX 0x40 #define CH341_LCR_MARK_SPACE 0x20 #define CH341_LCR_PAR_EVEN 0x10 #define CH341_LCR_ENABLE_PAR 0x08 #define CH341_LCR_STOP_BITS_2 0x04 #define CH341_LCR_CS8 0x03 #define CH341_LCR_CS7 0x02 #define CH341_LCR_CS6 0x01 #define CH341_LCR_CS5 0x00 //Flow control values #define CH34X_FLOW_CONTROL_NONE 0x0000 #define CH34X_FLOW_CONTROL_RTS_CTS 0x0101 #define CH34X_FLOW_CONTROL_DSR_DTR 0x0202 //Port state #if 0 #define CH341A_PORTA_STATE 0x01 #define CH341A_PORTB_STATE 0x02 #define CH341A_PORTC_STATE 0x03 #endif //CH34x Baud Rate #define CH341_BAUDRATE_FACTOR 1532620800 #define CH341_BAUDRATE_DIVMAX 3 #define CH341_DATA_IN (0x2|LIBUSB_ENDPOINT_IN) #define CH341_DATA_OUT (0x2|LIBUSB_ENDPOINT_OUT) #define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ) #define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT ) //#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_INTERFACE) //#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT | LIBUSB_RECIPIENT_INTERFACE) #define DEFAULT_BAUD_RATE 9600 // das hier ausprobieren #define CONTROL_REQUEST_TYPE_IN ( LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE ) #define CONTROL_REQUEST_TYPE_OUT ( LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE ) #define MAX_CONTROL_IN_TRANSFER_SIZE 2 #define MAX_CONTROL_OUT_TRANSFER_SIZE 2 #if 0 // CH341a READ EEPROM setup packet for the 24c64 // this needs putting into a struct to allow convenient access to individual elements #define CH341_EEPROM_READ_SETUP_CMD \ "\xaa\x74\x83\xa0\x00\x00\x74\x81\xa1\xe0\x00\x00\x06\x04\x00\x00" \ "\x00\x00\x00\x00\x40\x00\x00\x00\x11\x4d\x40\x77\xcd\xab\xba\xdc" \ "\xaa\xe0\x00\x00\xc4\xf1\x12\x00\x11\x4d\x40\x77\xf0\xf1\x12\x00" \ "\xd9\x8b\x41\x7e\x00\xf0\xfd\x7f\xf0\xf1\x12\x00\x5a\x88\x41\x7e" \ "\xaa\xe0\x00\x00\x2a\x88\x41\x7e\x06\x04\x00\x00\x11\x4d\x40\x77" \ "\xe8\xf3\x12\x00\x14\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" \ "\xaa\xdf\xc0\x75\x00" // for 24c64 #define CH341_EEPROM_READ_NEXT_CMD \ "\xaa\x74\x83\xa0\x00\x00\x74\x81\xa1\xe0\x00\x00\x10\x00\x00\x00" \ "\x00\x00\x00\x00\x8c\xf1\x12\x00\x01\x00\x00\x00\x00\x00\x00\x00" \ "\xaa\xe0\x00\x00\x4c\xf1\x12\x00\x5d\x22\xd7\x5a\xdc\xf1\x12\x00" \ "\x8f\x04\x44\x7e\x30\x88\x41\x7e\xff\xff\xff\xff\x2a\x88\x41\x7e" \ "\xaa\xe0\x00\x7e\x00\x00\x00\x00\x69\x0e\x3c\x00\x12\x01\x19\x00" \ "\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x2e\x68\x00" \ "\xaa\xdf\xc0\x75\x00" #define CH341_EEPROM_READ_CMD_SZ 0x65 #endif #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) class ch341; class ch341 : public QObject { Q_OBJECT public: ch341(QObject *parent = 0); ~ch341(); int32_t Open(uint16_t vid, uint16_t pid); void SetVerbose(void); void Close(); #if 0 int32_t SetStream(uint32_t speed); int32_t SpiCapacity(void); int32_t SpiRead(uint8_t *buf, uint32_t add, uint32_t len); int32_t ReadStatus(void); int32_t WriteStatus(uint8_t status); int32_t EraseChip(void); int32_t SpiWrite(uint8_t *buf, uint32_t add, uint32_t len); #endif int32_t Release(void); #if 0 int32_t readEEPROM(uint8_t *buffer, uint32_t bytestoread); int32_t writeEEPROM(uint8_t *buffer, uint32_t bytesum); #endif int32_t SetBaudRate(int32_t baudRate); int32_t SetTimeouts(int16_t t); int32_t SetBreakControl(int32_t state); void SetParity(uint8_t p); void SetBits(uint8_t b); void SetStops(uint8_t s); void SetFlowControl(uint8_t f); int32_t SetDTR(int32_t dtr); int32_t SetRTS(int32_t dtr); int32_t GetDSR(); int32_t GetCTS(); int32_t SetRTSDTR(int state); int32_t SetConfigLCR(); int32_t Probe(); int32_t ClearChip(); int32_t ResetChip(); // int32_t GetStatus(); int32_t GetStatusRx(); int32_t GetStatusTx(); // int32_t Read(uint8_t *buf, size_t len); // int32_t Write(uint8_t *buf, size_t len); void ReleaseInterface(void); void CloseHandle(); signals: // void receivedData(uint8_t *data, size_t len); void breakChanged(bool set); public slots: // void onRecieiveData(quint8 *data, qint16 len); // void sendData(const uint8_t &data, size_t len); void triggerBreak(uint msecs); private slots: void breakTimeout(); public: // for callback static int16_t read_completed; static int16_t write_completed; struct libusb_device_handle *devHandle; // struct libusb_transfer *ctrl_transfer; private: int32_t getModemState(void); int32_t setHandshakeByte(void); int32_t init(); // void updateStatus(); void v_print(int mode, int len); // void allocTransfer(); // int setAsync(unsigned char data); #if 0 void updateStatus(uint8_t *data, size_t l); void SpiChipSelect(uint8_t *ptr, bool selected); int32_t SpiStream(uint8_t *out, uint8_t *in, uint32_t len); int32_t usbTransfer(const char *func, uint8_t type, uint8_t *buf, int len); #endif private: struct dv { uint8_t dv_prescaler; uint8_t dv_div; uint8_t dv_mod; }; struct uart_div { uint32_t dvr_high; uint32_t dvr_low; uint32_t dvr_base_clock; struct dv dvr_divider; }; // MODEM output lines uint8_t dtr; // modem line uint8_t rts; // modem line uint8_t rtsCtsEnabled; uint8_t dtrDsrEnabled; // UART settings uint8_t parity; uint8_t bits; uint8_t stops; uint8_t flow_control; int32_t baudRate; int16_t timeout; // struct libusb_transfer *ctrl_transfer; // uint8_t ctrl_buf[LIBUSB_CONTROL_SETUP_SIZE]; // MODEM input lines uint8_t ctsState; uint8_t dsrState; uint8_t dcdState; uint8_t ringState; uint8_t lcr; // line control register uint8_t lsr; // line status register uint8_t msr; // modem status register uint8_t mcr; // modem control register uint8_t dev_vers; bool verbose; QTimer *breakTimer; int force_stop = 0; }; #endif tmp9balx013/SrcPony/at93cxx.h0000644000175000017500000000463313616566001016005 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _AT93CXX_H #define _AT93CXX_H #include "types.h" #include "at93cbus.h" #include "device.h" class At93cxx : public Device { public: At93cxx(e2AppWinInfo *wininfo = 0, BusIO *busp = 0); virtual ~At93cxx(); // int Probe(int probe_size = 0); int Read(int probe = 1, int type = ALL_TYPE); int Write(int probe = 1, int type = ALL_TYPE); int Verify(int type = ALL_TYPE); protected: At93cBus *GetBus() { return static_cast(Device::GetBus()); } private: }; #endif tmp9balx013/SrcPony/picbusnew.cpp0000644000175000017500000000727013616566001017034 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "picbusnew.h" #include "errcode.h" #include "globals.h" #include PicBusNew::PicBusNew(BusInterface *ptr) : PicBus(ptr) { } int PicBusNew::WaitReadyAfterWrite(long timeout) { WaitMsec(7); return OK; } long PicBusNew::Write(int addr, uint8_t const *data, long length, int page_size) { long len; WriteStart(); if (addr == 0) { length >>= 1; //convert counter from byte to word } for (len = 0; len < length; len++) { uint16_t val; //Send command opcode if (addr) { //Write Data code val = (uint16_t)(*data++); if (CompareSingleWord(val, 0xffff, DataMask) != 0) { SendCmdCode(LoadDataCode); SendDataCode(val); SendCmdCode(BeginProgOnlyCode); if (WaitReadyAfterWrite()) { break; } } //Verify while programming (10/11/99) // SendCmdCode(ReadDataCode); // if ( CompareSingleWord(val, RecvDataCode(), DataMask) ) // break; SendCmdCode(IncAddressCode); } else { #ifdef _BIG_ENDIAN_ val = (uint16_t)(*data++) << 8; val |= (uint16_t)(*data++); #else val = (uint16_t)(*data++); val |= (uint16_t)(*data++) << 8; #endif if (CompareSingleWord(val, 0xffff, ProgMask) != 0) { //Write Program code SendCmdCode(LoadProgCode); SendProgCode(val); SendCmdCode(BeginProgOnlyCode); if (WaitReadyAfterWrite()) { break; } } //Verify while programming (10/11/99) // SendCmdCode(ReadProgCode); // if ( CompareSingleWord(val, RecvProgCode(), ProgMask) ) // break; SendCmdCode(IncAddressCode); } if (WriteProgress(len * 100 / length)) { break; } } WaitMsec(1); //Flush WriteEnd(); if (addr == 0) { len <<= 1; //convert counter from word to byte } return len; } tmp9balx013/SrcPony/e2pfbuf.h0000644000175000017500000000451113616566001016026 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _E2PFBUF_H #define _E2PFBUF_H #include "types.h" #include "filebuf.h" #include "device.h" class e2pFileBuf : public FileBuf { public: e2pFileBuf(e2AppWinInfo *wininfo = 0); virtual ~e2pFileBuf(); virtual int Load(int loadtype = ALL_TYPE, long relocation_offfset = 0); virtual int Save(int savetype = ALL_TYPE, long relocation_offfset = 0); protected: private: // void check_offsets(); }; #endif tmp9balx013/SrcPony/prefdialog.cpp0000644000175000017500000001332613616566001017150 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "prefdialog.h" #include "ui_prefdialog.h" #include "e2profil.h" // ULTRASLOW = 0, // VERYSLOW, // SLOW, // NORMAL, // FAST, // TURBO PrefDialog::PrefDialog(QWidget *parent, const QString title) : QDialog(parent), ui(new Ui::PrefDialog) { ui->setupUi(this); setWindowTitle(title); QStringList speedItems = (QStringList() << "Slowest" << "Very Slow" << "Slow" << "Normal" << "Fast" << "Fastest"); ui->cbxBusSpeedSPI->addItems(speedItems); ui->cbxBusSpeedI2C->addItems(speedItems); ui->cbxBusSpeedIM->addItems(speedItems); ui->cbxBusSpeedPIC->addItems(speedItems); ui->cbxBusSpeedSDE->addItems(speedItems); ui->cbxBusSpeedMicroWire->addItems(speedItems); ui->lblBusSpeedSPI->setText("SPI Bus Speed"); ui->lblBusSpeedI2C->setText("I2C Bus Speed"); ui->lblBusSpeedIM->setText("IM Bus Speed"); ui->lblBusSpeedPIC->setText("PIC Bus Speed"); ui->lblBusSpeedSDE->setText("SDE Bus Speed"); ui->lblBusSpeedMicroWire->setText("MicroWire Bus Speed"); ui->cbxBusSpeedSPI->setCurrentIndex(E2Profile::GetSPISpeed()); ui->cbxBusSpeedI2C->setCurrentIndex(E2Profile::GetI2CSpeed()); ui->cbxBusSpeedIM->setCurrentIndex(E2Profile::GetIMBusSpeed()); ui->cbxBusSpeedPIC->setCurrentIndex(E2Profile::GetPICSpeed()); ui->cbxBusSpeedSDE->setCurrentIndex(E2Profile::GetSDESpeed()); ui->cbxBusSpeedMicroWire->setCurrentIndex(E2Profile::GetMicroWireSpeed()); ui->label_1->setText("Power Up Delay"); ui->label_2->setText("SPI Reset pulse"); ui->label_3->setText("SPI Delay After Reset"); ui->label_4->setText("AT89 Delay After Reset"); ui->label_5->setText("AVR Delay After Reset"); ui->label_6->setText("JDM Delay Cmd-to-Cmd"); ui->lineEdit_1->setToolTip("A Delay to let the board Power Up completely (milli sec)"); ui->lineEdit_2->setToolTip("Duration of SPI Reset pulse in milli sec"); ui->lineEdit_3->setToolTip("Delay for the first command after the reset pulse for SPI devices (milli sec)"); ui->lineEdit_4->setToolTip("Delay after reset for AT89xx devices, it increments the SPI delay (milli sec)"); ui->lineEdit_5->setToolTip("Delay after reset for AVR devices, it increments the SPI delay (milli sec)"); ui->lineEdit_6->setToolTip("Delay between two consecutive commands for JDM interface (micro sec)"); QValidator *validator = new QIntValidator(1, 999, this); ui->lineEdit_1->setValidator(validator); ui->lineEdit_2->setValidator(validator); ui->lineEdit_3->setValidator(validator); ui->lineEdit_4->setValidator(validator); ui->lineEdit_5->setValidator(validator); ui->lineEdit_6->setValidator(new QIntValidator(100, 10000, this)); ui->lineEdit_1->setText(QString::number(E2Profile::GetPowerUpDelay())); ui->lineEdit_2->setText(QString::number(E2Profile::GetSPIResetPulse())); ui->lineEdit_3->setText(QString::number(E2Profile::GetSPIDelayAfterReset())); ui->lineEdit_4->setText(QString::number(E2Profile::GetAT89DelayAfterReset())); ui->lineEdit_5->setText(QString::number(E2Profile::GetAVRDelayAfterReset())); ui->lineEdit_6->setText(QString::number(E2Profile::GetJDMCmd2CmdDelay())); } PrefDialog::~PrefDialog() { delete ui; } void PrefDialog::on_buttonBox_accepted() { E2Profile::SetSPISpeed(ui->cbxBusSpeedSPI->currentIndex()); E2Profile::SetI2CSpeed(ui->cbxBusSpeedI2C->currentIndex()); E2Profile::SetIMBusSpeed(ui->cbxBusSpeedIM->currentIndex()); E2Profile::SetPICSpeed(ui->cbxBusSpeedPIC->currentIndex()); E2Profile::SetSDESpeed(ui->cbxBusSpeedSDE->currentIndex()); E2Profile::SetMicroWireSpeed(ui->cbxBusSpeedMicroWire->currentIndex()); E2Profile::SetPowerUpDelay(ui->lineEdit_1->text().toInt()); E2Profile::SetSPIResetPulse(ui->lineEdit_2->text().toInt()); E2Profile::SetSPIDelayAfterReset(ui->lineEdit_3->text().toInt()); E2Profile::SetAT89DelayAfterReset(ui->lineEdit_4->text().toInt()); E2Profile::SetAVRDelayAfterReset(ui->lineEdit_5->text().toInt()); E2Profile::SetJDMCmd2CmdDelay(ui->lineEdit_6->text().toUInt()); } tmp9balx013/SrcPony/mpsse_interf.h0000644000175000017500000001332013616566001017171 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _MPSSE_INTERFACE_H #define _MPSSE_INTERFACE_H #include "businter.h" #include "ftdi.hpp" #include "interfconv.h" class MpsseCommandQueue { public: MpsseCommandQueue() { clear(); } void clear() { cmdidx = 0; } int getSize() { return cmdidx; } bool append(uint8_t dat) { if (cmdidx < sizeof(cmdbuf)) { cmdbuf[cmdidx++] = dat; return true; } else { return false; } } uint8_t *getBuffer() { return cmdbuf; } bool isFull() { return (cmdidx >= sizeof(cmdbuf)); } bool almostFull(int n = 6) { return (cmdidx >= sizeof(cmdbuf) - n); } bool isEmpty() { return (cmdidx == 0); } private: uint8_t cmdbuf[1024]; unsigned int cmdidx; }; class MpsseInterface : public BusInterface { public: MpsseInterface(); virtual ~MpsseInterface(); virtual int Open(int port); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn(); virtual int GetDataIn(int val); virtual int GetClock(); virtual int GetClock(int val); virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP(int val); virtual int IsClockDataUP(); virtual int IsClockDataDOWN(int val); virtual int IsClockDataDOWN(); virtual bool CheckDataLines(int len = 1, int sda = -1, int scl = -1); virtual int TestPort(int port); int SetPower(bool onoff); void SetControlLine(int res = 1); //void List(); virtual int Flush(); virtual int xferBit(int &err, int b, int mode = 0); virtual uint8_t xferByte(int &err, uint8_t by, int mode = 0, int bpw = 8, bool lsb_first = false); virtual unsigned long xferWord(int &err, unsigned long word_out, int mode = 0, int bpw = 8, bool lsb_first = false); virtual void SetDelay(int delay); virtual void ShotDelay(int n = 1); virtual void ConfigPins(int pinum_ctrl = -1, int pinum_datain = -1, int pinum_dataout = -1, int pinum_clock = -1, int pinum_clockin = -1, int pinum_poweron = -1, int pinum_enbus = -1, int pinnum_ctrlin = -1); static QStringList find_all(unsigned int vendor, unsigned int product) { QStringList retList; struct ftdi_device_list *dlist = 0; struct ftdi_context ftdi; ftdi_init(&ftdi); int count = ftdi_usb_find_all(&ftdi, &dlist, vendor, product); if (count > 0) { // Iterate list struct ftdi_device_list *l = dlist; for (int k = 0; l != 0 && k < count; l = l->next, k++) { char man[256]; char desc[256]; char ser[256]; int rv = ftdi_usb_get_strings(&ftdi, l->dev, man, sizeof(man), desc, sizeof(desc), ser, sizeof(ser)); if (rv == 0) { qDebug() << "Man : " << QString(man) << "Desc: " << QString(desc) << "Ser : " << QString(ser); retList << QString(ser) + " / " + QString(desc); } } ftdi_list_free(&dlist); } ftdi_deinit(&ftdi); return retList; } protected: int GetPresence(int mask, int val); int GetCtrlIn(int val); private: int InitPins(); void DeInitPins(); int SetFrequency(uint32_t freq); int SendPins(int new_data, int new_directions = -1); int GetPins(); int GetLowPinsMulti(int bufsiz, uint8_t *buf, int len); //utility to set/reset/toggle a pin unsigned int OutDataMask(int old_val, int mask, int val) { if (val == 0) { return old_val & ~mask; } else if (val == 1) { return old_val | mask; } else { return old_val ^ mask; } } unsigned int OutDataMask(int mask, int val) { return OutDataMask(last_data, mask, val); } Ftdi::Context ctx; MpsseCommandQueue cmdbuf; int pin_directions; bool ignore_last_data; int last_data; int read_data; int pin_ctrl; int pin_ctrlin; //0 if unused int pin_datain; int pin_dataout; int pin_clock; int pin_clockin; //0 if unused int pin_poweron; //0 if unused int pin_enbus; //0 if unused int ftdi_port; int test_step; }; #endif tmp9balx013/SrcPony/e2cmdw.cpp0000644000175000017500000040677613616566001016234 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qhexedit.h" #include "version.h" #include "e2profil.h" #include "e2dlg.h" #include "e2cmdw.h" // our header #include "infomdlg.h" #include "aboutmdlg.h" #include "filldlg.h" #include "fusemdlg.h" #include "blockmdlg.h" #include "progoption.h" #include "sernumdlg.h" #include "errcode.h" #include "eeptypes.h" #include "prefdialog.h" #define STATUSBAR_FORM " Size 0 Bytes CRC 0000h " #define STATUSBAR_PRINT " Size %5ld Bytes CRC %04Xh %c" class e2AppWinInfo; //Global e2CmdWindow pointer e2CmdWindow *cmdWin; // EK 2017 // TODO insert this into class QVector deviceMenu; void e2CmdWindow::About() { AboutModalDialog about(this, translate(STR_ABOUT) + " " APP_NAME); PlaySoundMsg(E2Profile::GetSoundEnabled()); about.exec(); } e2CmdWindow::e2CmdWindow(QWidget *parent) : QMainWindow(parent), e2App(), ignoreFlag(false), abortFlag(false), app_status(AppReady), verbose(verboseAll) { cmdWin = this; setupUi(this); qDebug() << Q_FUNC_INFO << "(" APP_NAME ")"; cbxEEPType = NULL; cbxEEPSubType = NULL; lblStringID = NULL; lblEEPInfo = NULL; e2Prg = NULL; currentMenu = NULL; currentAct = NULL; // EK 2017 // TODO to remove this to E2Profile init? // QFont sysFont = qApp->font(); // sysFont = sysFont; // EK 2017 // to check this fontSize = E2Profile::GetFontSize(); //sysFont.pointSize(); programStyleSheet = QString().sprintf("font-size: %dpt", fontSize); if (fontSize == -1) { fontSize = sysFont.pixelSize(); programStyleSheet = QString().sprintf("font-size: %dpx", fontSize); } if (programStyleSheet.length() > 0) { setStyleSheet(programStyleSheet); } if (readLangDir() == false) // init from langFiles variable in format "filename:language" { QMessageBox msgBox(QMessageBox::Warning, "Warning", "Directory with other languages not found\nDefault GUI language is english", QMessageBox::Close); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Close, "Close"); msgBox.exec(); } createFontSizeMenu(); // reading of arguments arguments = QCoreApplication::arguments(); // The first parameter of the command line is the file to open (optional) if (arguments.count() > 1 && arguments.at(1).length() > 0) { QString param = arguments.at(1); //Elimina eventuali virgolette che possono confondere // il programma param.remove(QChar('\"')); int p = param.lastIndexOf("."); if (p > 0 && param.indexOf(".e2s", p) >= 0) { //Switch to script mode scriptMode = true; script_name = param; } else if (param == "-s" || param == "--script") { if (arguments.count() > 2 && arguments.at(2).length() > 0) { param = arguments.at(2); //Elimina eventuali virgolette che possono confondere // il programma param.remove(QChar('\"')); scriptMode = true; script_name = param; } } } // end of init from AppMain // EK 2017 // TODO // terminal modus ?? if (scriptMode) { returnValue = CmdRunScript(); exit(returnValue); //Se AppMain ritorna un valore != 0 esce immediatamente } createFileList(); createScriptList(); // menu creation for all devices createDeviceMenues(); // status widget createStatusWidgets(); // combo boxes CbxMenuInit(); // UpdateMenuType(E2Profile::GetLastDevType()); // The Canvas qbuf = new QBuffer(this); e2HexEdit = new QHexEdit(this); //e2HexEdit->setMinimumSize(100, 100); qbufSplit = new QBuffer(this); e2HexEditSplit = new QHexEdit(this); splitter = new QSplitter(this); splitter->setOrientation(Qt::Vertical); splitter->setChildrenCollapsible(false); splitter->addWidget(e2HexEdit); splitter->addWidget(e2HexEditSplit); setCentralWidget(splitter); e2HexEdit->setFocus(); // create all signals, from e2HexEdit too createSignalSlotConnections(); if (getLangTable() == false) { QMessageBox msgBox(QMessageBox::Warning, "Language file error", "Can't open language file!\nDefault GUI language is english", QMessageBox::Close); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Close, "Close"); msgBox.exec(); E2Profile::SetCurrentLang("english"); } foreach (QAction *itL, actLangSelect) { QString lName = (*itL).text(); lName = lName.toLower(); if (lName == E2Profile::GetCurrentLang()) { (*itL).setChecked(true); break; } } translateGUI(); // if (!awip) { BusIO **b = GetBusVectorPtr(); awip = new e2AppWinInfo(this, "", b); // qDebug() << b << a; PostInit(); // removed from e2AppWinInfo } // The Status Bar // e2Status = new vStatusPane(StatBar); // AddPane(e2Status); // _timer = new e2Timer(this); // create timer // _timer->TimerSet(1000); // 1 second intervals // to show th main window // show(); // type_index = -1; //Initialize Type controls in Tool Bars // UpdateChipType( GetE2PPriType(GetLastDevType()), GetE2PSubType(GetLastDevType()) ); // UpdateMenuType( GetE2PPriType(E2Profile::GetLastDevType()), GetE2PSubType(E2Profile::GetLastDevType()) ); e2HexEdit->setReadOnly(!actionEditBuferEnabled->isChecked()); e2HexEditSplit->setReadOnly(!actionEditBuferEnabled->isChecked()); // e2HexEdit->setHighlightingColor(settings.value("Editor/HighlightingColor").value()); // e2HexEdit->setSelectionColor(settings.value("Editor/SelectionColor").value()); // e2HexEdit->setAddressAreaColor(settings.value("Editor/AddressAreaColor").value()); e2HexEdit->setAddressFontColor(Qt::darkRed); e2HexEditSplit->setAddressFontColor(Qt::darkRed); // e2HexEdit->setAsciiAreaColor(settings.value("Editor/AsciiAreaColor").value()); e2HexEdit->setAsciiFontColor(Qt::darkMagenta); e2HexEditSplit->setAsciiFontColor(Qt::darkMagenta); //e2HexEdit->setHexFontColor(Qt::darkGreen); e2HexEditSplit->setHexFontColor(Qt::darkBlue); e2HexEdit->setHexCaps(true); e2HexEditSplit->setHexCaps(true); // e2HexEdit->setFont(settings.value("Editor/Font").value()); // e2HexEdit->setAddressWidth(settings.value("AddressAreaWidth").toInt()); // e2HexEdit->setBytesPerLine(settings.value("BytesPerLine").toInt()); first_line = 0; //curIndex = 0; E2Profile::readDialogSettings(this, false); E2Profile::restoreSplitter(splitter); } e2CmdWindow::~e2CmdWindow() { qDebug() << Q_FUNC_INFO; // Now put a delete for each new in the constructor. //delete splitter; delete e2HexEdit; delete e2HexEditSplit; delete qbuf; delete qbufSplit; // EK 2017 // TODO remove created QAction* lists and other // delete e2ToolBar; // delete e2ToolBar2; // delete e2Status; // _timer->TimerStop(); // end it // delete _timer; // free it // delete e2Dlg; if (e2Prg) { delete e2Prg; } } /** * @brief create the list of loaded data files * */ void e2CmdWindow::createFileList() { filesMenu = new QMenu("Last files"); // TODO translate this actionFileList = menuFile->insertMenu(actionOpen, filesMenu); fileListgrp = new QActionGroup(this); } /** * @brief create the list of used scripts * */ void e2CmdWindow::createScriptList() { scrptsMenu = new QMenu("Last scripts"); // TODO translate this actionScriptList = menuScript->addMenu(scrptsMenu); scrListgrp = new QActionGroup(this); } /** * @brief slot from flAction * EK 2017 * TODO to implement */ void e2CmdWindow::onSelectFile(QAction *a) { //Check the Icon to set the load type int load_type; // qDebug() << "Ico name: " + QString(a->icon().cacheKey()) + " - " + actionOpenFlash->icon().cacheKey() + " - " + actionOpenEep->icon().cacheKey() + " - " + actionOpen->icon().cacheKey(); if (a->icon().cacheKey() == actionOpenFlash->icon().cacheKey()) { load_type = PROG_TYPE; } else if (a->icon().cacheKey() == actionOpenEep->icon().cacheKey()) { load_type = DATA_TYPE; } else { load_type = ALL_TYPE; } //We don't use text() here because some systems (KDE) insert '&' automatically to text. See https://bugs.kde.org/show_bug.cgi?id=337491 //don't use fname.remove(Qchar'&') in case there is a '&' in the filename QString fname = a->iconText(); fname.replace("~", QDir().homePath()); if (QFile().exists(fname)) { CmdOpen(load_type, fname); } else { QMessageBox msgBox(QMessageBox::Critical, "File error", translate(STR_MSGFILENOTFOUND), QMessageBox::Close); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); msgBox.exec(); } } /** * @brief scan the directory with translations. language files are with .utf extentions * */ bool e2CmdWindow::readLangDir() { bool found = false; QString lngDirName; QStringList dirsLang; QDir dir; QStringList trList; // EK 2017 // this for linux QString path = QDir::currentPath(); QString bdir = "/build"; if (path.endsWith(bdir)) { int pos = path.lastIndexOf(bdir); path.remove(pos, bdir.length()); } path += "/lang"; lngDirName = E2Profile::GetLangDir(); if (lngDirName.length() == 0) { lngDirName = qApp->applicationDirPath() + "/lang"; } qDebug() << "readLangDir path:" << path << ", Saved: " << lngDirName; #ifdef Q_OS_LINUX dirsLang << lngDirName << "/usr/share/ponyprog/lang" << "/usr/local/share/ponyprog/lang" << path; #else dirsLang << lngDirName << path; #endif foreach (const QString entry, dirsLang) { dir = QDir(entry); if (dir.exists() == true) { trList = dir.entryList(QStringList("*.utf")); if (trList.count() > 0) { E2Profile::SetLangDir(entry); lngDirName = entry + "/"; found = true; break; } } } if (found == false) { return false; } langFiles.clear(); found = false; QMenu *langMenu = new QMenu("Language"); QAction *actionLanguage = menuSetup->addMenu(langMenu); langGroup = new QActionGroup(this); foreach (const QString iL, trList) { QFile fLang(lngDirName + iL); if (fLang.exists() == false) { continue; } QString iconName; if (fLang.open(QIODevice::ReadOnly)) //load { QTextStream stream(&fLang); stream.setCodec("UTF-8"); int lines = 0; while (!stream.atEnd()) { QString line, nm; line = stream.readLine(); // line of text excluding '\n' lines++; if (line == "LANGUAGE_NAME") { line = stream.readLine(); selectedLang = line; lines++; nm = line; line[0] = line[0].toUpper(); found = true; langFiles << QString(iL + ":" + nm); QAction *tmpAction = new QAction(line, actionLanguage); tmpAction->setCheckable(true); langGroup->addAction(tmpAction); langMenu->addAction(tmpAction); if (E2Profile::GetCurrentLang() == nm) { tmpAction->setChecked(true); } actLangSelect.push_back(tmpAction); break; } if (lines > 8) { break; } } fLang.close(); } else { continue; } } connect(langGroup, SIGNAL(triggered(QAction *)), this, SLOT(setLang(QAction *))); return (found); } /** * @brief set GUI to selected language and do the translation of all GUI widgets * */ void e2CmdWindow::setLang(QAction *mnu) { QString lngStr; //mnu = langGroup->checkedAction(); lngStr = mnu->text(); lngStr = lngStr.remove(QChar('&')); lngStr = lngStr.toLower(); qDebug() << Q_FUNC_INFO << " lang: " << lngStr; E2Profile::SetCurrentLang(lngStr); if (getLangTable() == false) { qDebug() << "setLang" << false; } disconnect(langGroup, SIGNAL(triggered(QAction *)), this, SLOT(setLang(QAction *))); mnu->setChecked(true); connect(langGroup, SIGNAL(triggered(QAction *)), this, SLOT(setLang(QAction *))); translateGUI(); } /** * @brief translate the GUI widgets * */ void e2CmdWindow::translateGUI() { menuFile->setTitle(translate(STR_MENUFILE)); // actionNew->setText(translate(STR_NEWWIN)); // EK 2017 ??? // TODO translation for last files actionOpen->setText(translate(STR_OPEN)); actionOpenFlash->setText(translate(STR_OPENFLASH)); actionOpenEep->setText(translate(STR_OPENDATA)); actionSave->setText(translate(STR_SAVE)); actionSaveAs->setText(translate(STR_SAVEAS)); actionSaveFlashAs->setText(translate(STR_SAVEFLASH)); actionSaveEepAs->setText(translate(STR_SAVEDATA)); actionReload->setText(translate(STR_RELOAD)); actionPrint->setText(translate(STR_PRINT)); // actionClose->setText(translate(STR_CLOSE)); actionExit->setText(translate(STR_EXIT)); menuDevice->setTitle(translate(STR_MENUDEVICE)); // for all device and chip id's menuCommand->setTitle(translate(STR_MENUCMD)); actionReadAll->setText(translate(STR_READALL)); actionReadFlash->setText(translate(STR_READPROG)); actionReadEep->setText(translate(STR_READDATA)); actionWriteAll->setText(translate(STR_WRITEALL)); actionWriteFlash->setText(translate(STR_WRITEPROG)); actionWriteEep->setText(translate(STR_WRITEDATA)); actionVerifyAll->setText(translate(STR_VERIFYALL)); actionVerifyFlash->setText(translate(STR_VERIFYPROG)); actionVerifyEep->setText(translate(STR_VERIFYDATA)); //actionWriteSecurity->setText(translate(STR_WRITESECBITS)); actionErase->setText(translate(STR_ERASE)); actionReset->setText(translate(STR_RESET)); actionProgram->setText(translate(STR_PROGRAM)); actionProgramOptions->setText(translate(STR_PROGOPTION)); actionReadOscByte->setText(translate(STR_READOSCCALIB)); actionOscOptions->setText(translate(STR_OSCCALIBOPTION)); menuScript->setTitle(translate(STR_MENUSCRIPT)); // TODO translation for last scripts actionLoadScript->setText(translate(STR_LOADSCR)); actionRunScript->setText(translate(STR_RUNSCR)); // STR_EDITSCR // STR_AUTOLOADSCR menuUtility->setTitle(translate(STR_MENUUTIL)); actionClearBuffer->setText(translate(STR_CLEARBUF)); actionFillBuffer->setText(translate(STR_FILLBUF)); actionDoubleBank->setText(translate(STR_DOUBLEBANK)); actionSetSN->setText(translate(STR_DOWNSERNUM)); actionSNConfig->setText(translate(STR_SERNUMCONF)); // STR_BYTESWAP menuSetup->setTitle(translate(STR_MENUSETUP)); // TODO translation for font size actionInterfaceSetup->setText(translate(STR_INTERFSETUP)); actionCalibration->setText(translate(STR_CALIBRATION) + "..."); actionPreferences->setText(translate(STR_PREFERENCES) + "..."); // STR_REMOTEMODE menuHelp->setTitle(translate(STR_MENUQMARK)); actionHelp->setText(translate(STR_MENUHELP)); actionAbout->setText(translate(STR_MENUABOUT)); menuEdit->setTitle(translate(STR_MENUEDIT)); actionEditNote->setText(translate(STR_EDITNOTE)); actionEditBuferEnabled->setText(translate(STR_EDITBUFENA)); } /** * @brief try to find the translation file * */ bool e2CmdWindow::getLangTable() { QString lang = E2Profile::GetCurrentLang(); QString fileLang = ""; foreach (const QString iLang, langFiles) { int pos = iLang.lastIndexOf(":" + lang); if (pos > 0) { fileLang = iLang.left(pos); break; } } if (fileLang == "") { return false; } qDebug() << Q_FUNC_INFO << " " << fileLang; if (QFile::exists(E2Profile::GetLangDir() + "/" + fileLang) == false) { QMessageBox msgBox(QMessageBox::Warning, "Warning", "Language file does not exist!\n\n" + E2Profile::GetLangDir() + "\n\n" + fileLang, QMessageBox::Close); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); msgBox.exec(); // not found return false; } return loadTranslation(E2Profile::GetLangDir() + "/" + fileLang); } int e2CmdWindow::OnError(int err_no, const QString &msgerr) { int rv = 0; QString msg; // TODO translate buttons switch (err_no) { case 0: { QMessageBox note(QMessageBox::Critical, "Error", translate(STR_DEVNOTRESP), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case BADPARAM: { QMessageBox msgBox(QMessageBox::Question, "Error", translate(STR_MSGBADPARAM), QMessageBox::Ignore | QMessageBox::Abort | QMessageBox::Retry); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ignore, translate(STR_IGNORE)); msgBox.setButtonText(QMessageBox::Abort, translate(STR_ABORT)); msgBox.setButtonText(QMessageBox::Retry, translate(STR_RETRY)); rv = msgBox.exec(); break; } case DEVICE_BADTYPE: { QString str = awip ? awip->GetDetectedTypeStr() : ""; if (str.length() > 0) { msg = QString("%1 (%2)\nDetected type: %3").arg(translate(STR_DEVBADTYPE)).arg(err_no).arg(str); } else { msg = QString("%1 (%2)").arg(translate(STR_DEVBADTYPE)).arg(err_no); } QMessageBox msgBox(QMessageBox::Question, "Error", msg, QMessageBox::Ignore | QMessageBox::Abort | QMessageBox::Retry); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ignore, translate(STR_IGNORE)); msgBox.setButtonText(QMessageBox::Abort, translate(STR_ABORT)); msgBox.setButtonText(QMessageBox::Retry, translate(STR_RETRY)); rv = msgBox.exec(); break; } case DEVICE_UNKNOWN: { QString str = awip ? awip->GetDetectedSignatureStr() : ""; if (str.length() > 0) { msg = QString("%1 (%2)\nDetected signature: %3").arg(translate(STR_DEVUNKNOWN)).arg(err_no).arg(str); } else { msg = QString("%1 (%2)").arg(translate(STR_DEVUNKNOWN)).arg(err_no); } QMessageBox msgBox(QMessageBox::Question, "Error", msg, QMessageBox::Ignore | QMessageBox::Abort | QMessageBox::Retry); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ignore, translate(STR_IGNORE)); msgBox.setButtonText(QMessageBox::Abort, translate(STR_ABORT)); msgBox.setButtonText(QMessageBox::Retry, translate(STR_RETRY)); rv = msgBox.exec(); break; } case DEVICE_LOCKED: { msg = QString("%1 (%2)").arg(translate(STR_DEVLOCKED)).arg(err_no); QMessageBox msgBox(QMessageBox::Question, "Error", msg, QMessageBox::Ignore | QMessageBox::Abort | QMessageBox::Retry); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ignore, translate(STR_IGNORE)); msgBox.setButtonText(QMessageBox::Abort, translate(STR_ABORT)); msgBox.setButtonText(QMessageBox::Retry, translate(STR_RETRY)); rv = msgBox.exec(); break; } case OP_ABORTED: { QMessageBox note(QMessageBox::Information, "Information", translate(STR_OPABORTED), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case E2ERR_OPENFAILED: { msg = QString("%1 (%2)").arg(translate(STR_OPENFAILED)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case E2ERR_ACCESSDENIED: { msg = QString("%1 (%2)").arg(translate(STR_ACCDENIED)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case E2ERR_NOTINSTALLED: { msg = QString("%1 (%2)").arg(translate(STR_NOTINST)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case IICERR_SDACONFLICT: case IICERR_SCLCONFLICT: { msg = QString("%1 (%2)").arg(translate(STR_HWERROR)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case IICERR_BUSBUSY: { msg = QString("%1 (%2)").arg(translate(STR_BUSBUSY)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case IICERR_NOTACK: { msg = QString("%1 (%2)").arg(translate(STR_I2CNOACK)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case IICERR_NOADDRACK: { msg = QString("%1 (%2)").arg(translate(STR_I2CNODEV)).arg(err_no); QMessageBox msgBox(QMessageBox::Question, "Error", msg, QMessageBox::Ignore | QMessageBox::Abort | QMessageBox::Retry); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ignore, translate(STR_IGNORE)); msgBox.setButtonText(QMessageBox::Abort, translate(STR_ABORT)); msgBox.setButtonText(QMessageBox::Retry, translate(STR_RETRY)); rv = msgBox.exec(); break; } case IICERR_TIMEOUT: { msg = QString("%1 (%2)").arg(translate(STR_I2CTIMEOUT)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case IICERR_STOP: { msg = QString("%1 (%2)").arg(translate(STR_I2CSTOPERR)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case E2ERR_WRITEFAILED: { msg = QString("%1 (%2)").arg(translate(STR_WRITEERR)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case E2ERR_BLANKCHECKFAILED: { msg = QString("%1 (%2)").arg(translate(STR_BLANKCHECKERR)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } case NOTSUPPORTED: { msg = QString("%1 (%2)").arg(translate(STR_OPNOTSUP)).arg(err_no); QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } default: { if (msgerr.length()) { msg = msgerr; } else { msg = QString("%1 (%2)").arg(translate(STR_ERRNO)).arg(err_no); } QMessageBox note(QMessageBox::Critical, "Error", msg, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); break; } } return rv; } /** * @brief * */ void e2CmdWindow::addI2C8Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "I2C Bus 8bit eeprom"; mTmp->pre_type << E24XX << E24XX1_A << E24XX1_B << E24XX5; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addI2C16Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "I2C Bus 16bit eeprom"; mTmp->pre_type << E24XX2; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addI2CAT17Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "I2C Bus AT17 eeprom"; mTmp->pre_type << AT17XXX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addMW16Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "MicroWire16 eeprom"; mTmp->pre_type << E93X6; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addMW8Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "MicroWire8 eeprom"; mTmp->pre_type << E93XX_8; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addSPIStruct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "SPI eeprom"; mTmp->pre_type << E250XX << E25XXX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addAT90Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "AT90 micro"; mTmp->pre_type << AT90SXX; addMenuVector(mTmp, "AT90"); mTmp = new menuToGroup(); mTmp->title = "ATmega micro"; mTmp->pre_type << AT90SXX; addMenuVector(mTmp, "ATmega"); mTmp = new menuToGroup(); mTmp->title = "ATtiny micro"; mTmp->pre_type << AT90SXX; addMenuVector(mTmp, "ATtiny"); } /** * @brief * */ void e2CmdWindow::addAT89Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "AT89S micro"; mTmp->pre_type << AT89SXX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addPIC16Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "PIC 16 micro"; mTmp->pre_type << PIC168XX << PIC16XX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addPIC12Struct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "PIC 12 micro"; mTmp->pre_type << PIC125XX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addIMBUSStruct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "ImBus eeprom"; mTmp->pre_type << ENVMXXX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addSDEStruct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "SDE2506 eeprom"; mTmp->pre_type << E2506XX; addMenuVector(mTmp); } /** * @brief * */ void e2CmdWindow::addX24CStruct() { menuToGroup *mTmp = new menuToGroup(); mTmp->title = "X2444 eeprom"; mTmp->pre_type << X24C44XX; addMenuVector(mTmp); } void e2CmdWindow::addMenuVector(menuToGroup *vecMnu, const QString &filter) { vecMnu->mnu = new QMenu(vecMnu->title); vecMnu->grp = new QActionGroup(this); vecMnu->filter = filter; QAction *actionRecent = menuDevice->addMenu(vecMnu->mnu); if (filter.length() == 0) // old method { for (int i = 0; i < vecMnu->pre_type.count(); i++) { vecMnu->info << GetEEPSubTypeVector(vecMnu->pre_type.at(i)); } for (int i = 0; i < vecMnu->info.count(); i++) { QString entry = vecMnu->info[i].name; QAction *tmpAction = new QAction(entry, actionRecent); tmpAction->setCheckable(true); vecMnu->mnu->addAction(tmpAction); vecMnu->grp->addAction(tmpAction); } } else // filter for splitting of ATtiny, ATmega, AT90 { QVector tmpInfo; for (int i = 0; i < vecMnu->pre_type.count(); i++) { tmpInfo << GetEEPSubTypeVector(vecMnu->pre_type.at(i)); } for (int i = 0; i < tmpInfo.count(); i++) { if (tmpInfo.at(i).name.indexOf(filter) == 0) { vecMnu->info << tmpInfo.at(i); } } for (int i = 0; i < vecMnu->info.count(); i++) { if (vecMnu->info[i].name.indexOf(filter) == 0) { QString entry = vecMnu->info[i].name; QAction *tmpAction = new QAction(entry, actionRecent); tmpAction->setCheckable(true); vecMnu->mnu->addAction(tmpAction); vecMnu->grp->addAction(tmpAction); } } } connect(vecMnu->grp, SIGNAL(triggered(QAction *)), this, SLOT(onSelectChip(QAction *))); deviceMenu << *vecMnu; } /** * @brief * */ void e2CmdWindow::createDeviceMenues() { // to add into menu: menuDevice // I2Cbus8: eep24xx_map, eep24xx1A_map, eep24xx1B_map, eep24xx5_map addI2C8Struct(); // I2Cbus16: eep24xx2_map addI2C16Struct(); // I2CbusAT17: eep17xxx_map addI2CAT17Struct(); // MicroWire16: eep93x6_map addMW16Struct(); // MicroWire8: eep93xx8_map addMW8Struct(); // SPI eeprom: eep250xx_map, eep25xxx_map addSPIStruct(); // AVR: eepAt90_map addAT90Struct(); // AT89: eepAt89_map addAT89Struct(); // PIC16: eepPic168xx_map, eepPic16_map addPIC16Struct(); // PIC12: eepPic125_map addPIC12Struct(); // ImBus: eepnvm3060_map addIMBUSStruct(); // SDE: eep2506_map addSDEStruct(); // X2444: eep2444_map addX24CStruct(); } /** * @brief creating of QProgressDialog and start * */ void e2CmdWindow::doProgress(const QString &text) { if (e2Prg) { qDebug() << "e2Prg alread exist"; e2Prg->setLabelText(text); e2Prg->reset(); //e2Prg->setValue(0); } else { e2Prg = new QProgressDialog(text, translate(STR_ABORT), 0, 100, this); e2Prg->setWindowModality(Qt::WindowModal); e2Prg->setMinimumDuration(100); e2Prg->setAutoReset(true); e2Prg->setAutoClose(true); //connect(e2Prg, SIGNAL(canceled()), this, SLOT(onEndProgress())); } } /** * @brief SLOT from "cancel" of ProgressDialog * */ //void e2CmdWindow::onEndProgress() //{ // if (e2Prg) // { // e2Prg->close(); // delete e2Prg; // e2Prg = NULL; // } // qDebug() << "progress dialog finished"; //} #if 0 int e2CmdWindow::findItemInMenuVector(const QString &n) { for (int idx = 0; idx < deviceMenu.count(); idx++) { if (deviceMenu.at(idx).mnu->title() == n) { return idx; } } return -1; } #endif /** * @brief slot for signal from action group * */ void e2CmdWindow::onSelectChip(QAction *a) { if (!IsAppReady()) { return; } QString t = ((QAction *)a->parent())->text(); // current type QString st = a->text(); // current subtype long new_id = selectTypeSubtype(t, st); if (currentAct != NULL) { currentAct->setChecked(false); } currentAct = a; currentAct->setChecked(true); qDebug() << Q_FUNC_INFO << "Id: " << (hex) << awip->GetEEPId() << " NewId: " << new_id; if (awip->GetEEPId() != new_id) { CmdSelectDevice(new_id); } } long e2CmdWindow::selectTypeSubtype(const QString &tp, const QString &subtp) { QString t_tmp = tp; t_tmp.remove(QChar('&')); QString st_tmp = subtp; st_tmp.remove(QChar('&')); //qDebug() << Q_FUNC_INFO << " " << t_tmp << st_tmp << currentMenu->title; //bool rebuildSubmenu = true; if (currentMenu == NULL || currentMenu->title != t_tmp || cbxEEPSubType->count() == 0) // update the type combobox { int nt = cbxEEPType->findText(t_tmp); if (nt == -1) // not found, it's criminal { nt = 0; } disconnect(cbxEEPType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevType(int))); cbxEEPType->setCurrentIndex(nt); connect(cbxEEPType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevType(int))); for (int i = 0; i < deviceMenu.count(); i++) { if (deviceMenu.at(i).title == t_tmp) { // qDebug() << "gefunden" << deviceMenu.at(i).title; currentMenu = (menuToGroup *)&deviceMenu.at(i); break; } } // rebuildSubmenu = true; // } // rebuild the subtype list // if (cbxEEPSubType->count() == 0 || cbxEEPSubType-> != st_tmp) // { // rebuildSubmenu = true; // } // // if (rebuildSubmenu == true) // { disconnect(cbxEEPSubType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevSubType(int))); cbxEEPSubType->clear(); QStringList l; // qDebug() << "filter" << currentMenu->title; if (currentMenu->filter.length() > 0) { // qDebug() << "filter" << currentMenu << currentMenu->filter; foreach (chipInfo cInf, currentMenu->info) { if (cInf.name.indexOf(currentMenu->filter) == 0) { l << cInf.name; } } } else { foreach (chipInfo cInf, currentMenu->info) { l << cInf.name; } } if (l.count()) // refresh combobox list for subtype { cbxEEPSubType->addItems(l); } else { qDebug() << "selectTypeSubtype, something is wrong with search" << currentMenu->title; return EID_INVALID; } connect(cbxEEPSubType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevSubType(int))); } int nst = cbxEEPSubType->findText(st_tmp); if (nst == -1) { nst = 0; } disconnect(cbxEEPSubType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevSubType(int))); cbxEEPSubType->setCurrentIndex(nst); connect(cbxEEPSubType, SIGNAL(currentIndexChanged(int)), this, SLOT(onDevSubType(int))); if (currentMenu == NULL) { qDebug() << "selectTypeSubtype, something is wrong with data pointer"; return EID_INVALID; } // search id long new_id = EID_INVALID; for (int i = 0; i < currentMenu->info.count(); i++) { if (currentMenu->info.at(i).name == st_tmp) { new_id = currentMenu->info.at(i).id; } } Q_ASSERT(new_id != EID_INVALID); return new_id; } /** * @brief slot from selecto font size menu * */ void e2CmdWindow::selectFontSize(QAction *mnu) { QString lngStr; lngStr = mnu->text(); lngStr.remove(QChar('&')); fontSize = lngStr.toInt(); mnu->setChecked(true); int sz = sysFont.pointSize(); // for lang menu and for fontsize menu if (sz == -1) { programStyleSheet = QString().sprintf("font-size: %dpx", fontSize); } else { programStyleSheet = QString().sprintf("font-size: %dpt", fontSize); } E2Profile::SetFontSize(fontSize); QString sSheet2 = QString("QMenu { %1; }").arg(programStyleSheet); setStyleSheet(programStyleSheet); // langMenu->setStyleSheet(sSheet2); setFontForWidgets(); } void e2CmdWindow::setFontForWidgets() { //TODO: use font selection dialog to select the font #ifdef Q_OS_WIN32 e2HexEdit->setFont(QFont("Courier", E2Profile::GetFontSize())); e2HexEditSplit->setFont(QFont("Courier", E2Profile::GetFontSize())); #else e2HexEdit->setFont(QFont("Monospace", E2Profile::GetFontSize())); e2HexEditSplit->setFont(QFont("Monospace", E2Profile::GetFontSize())); #endif // buttonsWidget->setStyleSheet(programStyleSheet); // // for (int i = 0; i < 6; i++) { // widgets[i]->setStyleSheet(programStyleSheet); // } } /** * @brief create menu with action group for font size selection * */ void e2CmdWindow::createFontSizeMenu() { QMenu *m = new QMenu("Font size"); /*QAction *fontSizeMenu = */ menuSetup->addMenu(m); // QMenu *fontSizeMenu = new QMenu(); fsizeGroup = new QActionGroup(this); QStringList szList; szList << "9" << "10" << "12" << "14" << "16" << "18" << "20"; foreach (QString entry, szList) { QAction *tmpAction = new QAction(entry, m); tmpAction->setCheckable(true); m->addAction(tmpAction); fsizeGroup->addAction(tmpAction); if (fontSize == entry.toInt()) { tmpAction->setChecked(true); } actFSizeSelect.push_back(tmpAction); } connect(fsizeGroup, SIGNAL(triggered(QAction *)), this, SLOT(selectFontSize(QAction *))); } void e2CmdWindow::onDtaChanged() { if (awip) { awip->BufChanged(e2HexEdit->isModified() || e2HexEditSplit->isModified()); UpdateStatusBar(); } } /** * @brief create all SIGNAL -> SLOT connections * EK 2017 * @TODO to check all connections from "action" widgets */ void e2CmdWindow::createSignalSlotConnections() { // actions from Ui class // hex editor connections // connect(e2HexEdit, SIGNAL(overwriteModeChanged(bool)), this, SLOT(onOverwriteMode(bool))); connect(e2HexEdit, SIGNAL(dataChanged()), this, SLOT(onDtaChanged())); connect(e2HexEditSplit, SIGNAL(dataChanged()), this, SLOT(onDtaChanged())); // EK 2017 // TODO // not implemented are: cut/copy/paste buttons // font size //connect(fsizeGroup, SIGNAL(triggered()), this, SLOT(selectFontSize())); // new // connect(actionNew, SIGNAL(triggered()), this, SLOT(onNew())); // open all connect(actionOpen, SIGNAL(triggered()), this, SLOT(onOpen())); // open flash connect(actionOpenFlash, SIGNAL(triggered()), this, SLOT(onOpen())); // open eeprom connect(actionOpenEep, SIGNAL(triggered()), this, SLOT(onOpen())); // reload connect(actionReload, SIGNAL(triggered()), this, SLOT(onReload())); // save all connect(actionSave, SIGNAL(triggered()), this, SLOT(onSave())); #if 0 // save all connect(actionSaveFlash, SIGNAL(triggered()), this, SLOT(onSave(PROG_TYPE))); // save all connect(actionSaveEep, SIGNAL(triggered()), this, SLOT(onSave(DATA_TYPE))); #endif // save all connect(actionSaveAs, SIGNAL(triggered()), this, SLOT(onSaveAs())); // save flash connect(actionSaveFlashAs, SIGNAL(triggered()), this, SLOT(onSaveAs())); // save eeprom connect(actionSaveEepAs, SIGNAL(triggered()), this, SLOT(onSaveAs())); // print connect(actionPrint, SIGNAL(triggered()), this, SLOT(onPrint())); // close // connect(actionClose, SIGNAL(triggered()), this, SLOT(onClose())); // exit connect(actionExit, SIGNAL(triggered()), this, SLOT(onExit())); // about connect(actionAbout, SIGNAL(triggered()), this, SLOT(onAbout())); // about qt connect(actionAboutQt, SIGNAL(triggered()), this, SLOT(onAboutQt())); // help connect(actionHelp, SIGNAL(triggered()), this, SLOT(onHelp())); // write all connect(actionWriteAll, SIGNAL(triggered()), this, SLOT(onWrite())); // write flash connect(actionWriteFlash, SIGNAL(triggered()), this, SLOT(onWrite())); // write data connect(actionWriteEep, SIGNAL(triggered()), this, SLOT(onWrite())); // read all connect(actionReadAll, SIGNAL(triggered()), this, SLOT(onRead())); // read flash connect(actionReadFlash, SIGNAL(triggered()), this, SLOT(onRead())); // read data connect(actionReadEep, SIGNAL(triggered()), this, SLOT(onRead())); // verify all connect(actionVerifyAll, SIGNAL(triggered()), this, SLOT(onVerify())); // erase all // not implemented: erase flash, erase eeprom connect(actionErase, SIGNAL(triggered()), this, SLOT(onErase())); // verify flash connect(actionVerifyFlash, SIGNAL(triggered()), this, SLOT(onVerify())); // verify data connect(actionVerifyEep, SIGNAL(triggered()), this, SLOT(onVerify())); // prog options connect(actionProgramOptions, SIGNAL(triggered()), this, SLOT(onProgramOptions())); // load script connect(actionLoadScript, SIGNAL(triggered()), this, SLOT(onLoadScript())); connect(actionScript, SIGNAL(triggered()), this, SLOT(onLoadScript())); // run script //connect(actionRunScript, SIGNAL(triggered()), this, SLOT(onRunScript())); // reset connect(actionReset, SIGNAL(triggered()), this, SLOT(onReset())); #ifdef vDEBUG // load script connect(actionDebugger, SIGNAL(triggered()), this, SLOT(onDebugger())); #endif // edit buffer connect(actionEditBuferEnabled, SIGNAL(triggered()), this, SLOT(onEditBufToggle())); // calibration connect(actionCalibration, SIGNAL(triggered()), this, SLOT(onCalibration())); // program connect(actionProgram, SIGNAL(triggered()), this, SLOT(onProgram())); // byte swap connect(actionByteSwap, SIGNAL(triggered()), this, SLOT(onByteSwap())); // double buffer connect(actionDoubleBank, SIGNAL(triggered()), this, SLOT(onDoubleSize())); // set serial number connect(actionSetSN, SIGNAL(triggered()), this, SLOT(onSetSerialNumber())); connect(actionSerial_Number, SIGNAL(triggered()), this, SLOT(onSetSerialNumber())); // connect(actionEraseFlash, SIGNAL(triggered()), this, SLOT( onClearBuf(PROG_TYPE))); // connect(actionEraseEep, SIGNAL(triggered()), this, SLOT( onClearBuf(DATA_TYPE))); // edit notes connect(actionEditNote, SIGNAL(triggered()), this, SLOT(onEditNote())); // write security bits //connect(actionWriteSecurity, SIGNAL(triggered()), this, SLOT(onWriteSecurity())); // clear buffer connect(actionClearBuffer, SIGNAL(triggered()), this, SLOT(onClearBuf())); // fill buffer connect(actionFillBuffer, SIGNAL(triggered()), this, SLOT(onFillBuf())); connect(actionLock, SIGNAL(triggered()), this, SLOT(onSpecialBits())); connect(actionSpecialBits, SIGNAL(triggered()), this, SLOT(onSpecialBits())); connect(actionOscOptions, SIGNAL(triggered()), this, SLOT(onOscCalibOption())); // get device info // connect(actionGetInfo, SIGNAL(triggered()), this, SLOT(onGetInfo())); // ??? // connect(actionWriteHEndu, SIGNAL(triggered()), this, SLOT( onWriteHEndurance())); connect(actionSNConfig, SIGNAL(triggered()), this, SLOT(onSerialNumberOptions())); #if 0 connect(actiontEnableToolBar, SIGNAL(triggered()), this, SLOT(onEnableToolBar(int val))); // connect(actiontLastFile1, SIGNAL(triggered()), this, SLOT( onLastFile1())); // connect(actiontLastFile2, SIGNAL(triggered()), this, SLOT( onLastFile2())); connect(actiontAskToSave, SIGNAL(triggered()), this, SLOT(onAskToSave())); connect(actiontProgress, SIGNAL(triggered()), this, SLOT(onProgress(int val))); connect(actiontCloseAll, SIGNAL(triggered()), this, SLOT(onCloseAllDialog())); connect(actiontSelectDevice, SIGNAL(triggered()), this, SLOT(onSelectDevice(long new_type))); connect(actiontEEPType, SIGNAL(triggered()), this, SLOT(onSelectEEPType(int val))); connect(actiontEEPSubtype, SIGNAL(triggered()), this, SLOT(onEEPSubType(int val))); #endif connect(actionReadOscByte, SIGNAL(triggered()), this, SLOT(onReadCalibration())); // interface setup connect(actionInterfaceSetup, SIGNAL(triggered()), this, SLOT(onInterfSetup())); connect(actionSetup, SIGNAL(triggered()), this, SLOT(onInterfSetup())); // connect(actiontReadSecurity, SIGNAL(triggered()), this, SLOT( onReadSecurity(bool display_dialog))); // connect(pushOk, SIGNAL(clicked()), this, SLOT(onOk())); } void e2CmdWindow::onInterfSetup() { if (IsAppReady()) { e2Dialog e2dlg(this, translate(STR_DLGIOSETUP)); if (e2dlg.exec() == QDialog::Accepted) { // EK 2017 // TODO set the global settings? } } } #if 0 void e2CmdWindow::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { event->accept(); } } void e2CmdWindow::dropEvent(QDropEvent *event) { if (event->mimeData()->hasUrls()) { QList urls = event->mimeData()->urls(); QString filePath = urls.at(0).toLocalFile(); loadFile(filePath); event->accept(); } } #endif void e2CmdWindow::onGetInfo() { if (IsAppReady()) { SetAppBusy(); CmdGetInfo(); SetAppReady(); } } void e2CmdWindow::onExit() { Exit(); qApp->quit(); } #include void e2CmdWindow::closeEvent(QCloseEvent *event) { Exit(); //event->ignore(); event->accept(); } #if 0 void e2CmdWindow::onClose() { // CloseAppWin(); Exit(); } #endif void e2CmdWindow::onOpen() { if (IsAppReady()) { QAction *a = static_cast(sender()); if (a == actionOpen) { CmdOpen(ALL_TYPE); } else if (a == actionOpenFlash) { CmdOpen(PROG_TYPE); } else if (a == actionOpenEep) { CmdOpen(DATA_TYPE); } } } void e2CmdWindow::onSave() { if (IsAppReady()) { QAction *a = static_cast(sender()); if (a == actionSave) { CmdSave(ALL_TYPE); } } } void e2CmdWindow::onSaveAs() { if (IsAppReady()) { QAction *a = static_cast(sender()); if (a == actionSaveAs) { CmdSaveAs(ALL_TYPE); } else if (a == actionSaveFlashAs) { CmdSaveAs(PROG_TYPE); } else if (a == actionSaveEepAs) { CmdSaveAs(DATA_TYPE); } } } void e2CmdWindow::onReload() { if (IsAppReady()) { CmdReload(); } } void e2CmdWindow::onPrint() { if (IsAppReady()) { CmdPrint(); } } void e2CmdWindow::onWrite() { if (IsAppReady()) { bool verify = E2Profile::GetVerifyAfterWrite(); QAction *a = static_cast(sender()); SetAppBusy(); if (a == actionWriteAll) { CmdWrite(ALL_TYPE, verify); } else if (a == actionWriteFlash) { CmdWrite(PROG_TYPE, verify); } else if (a == actionWriteEep) { CmdWrite(DATA_TYPE, verify); } SetAppReady(); } } void e2CmdWindow::onRead() { QAction *a = static_cast(sender()); SetAppBusy(); if (a == actionReadAll) { CmdRead(ALL_TYPE); } else if (a == actionReadFlash) { CmdRead(PROG_TYPE); } else if (a == actionReadEep) { CmdRead(DATA_TYPE); } SetAppReady(); } // EK 2017 // only for "all"? void e2CmdWindow::onErase() { if (IsAppReady()) { SetAppBusy(); CmdErase(ALL_TYPE); SetAppReady(); } } void e2CmdWindow::onVerify() { if (IsAppReady()) { QAction *a = static_cast(sender()); SetAppBusy(); if (a == actionVerifyAll) { CmdVerify(ALL_TYPE); } else if (a == actionVerifyFlash) { CmdVerify(PROG_TYPE); } else if (a == actionVerifyEep) { CmdVerify(DATA_TYPE); } SetAppReady(); } else { qDebug() << "onVerify() App not ready!!!"; } } /** * @brief slot from scrAction * */ void e2CmdWindow::onSelectScript(QAction *a) { if (IsAppReady()) { QString fname = a->iconText(); fname.replace("~", QDir().homePath()); if (QFile().exists(fname)) { script_name = fname; SetAppBusy(); CmdRunScript(); SetAppReady(); } } } #if 0 void e2CmdWindow::onRunScript() { if (IsAppReady()) { QStringList lst = E2Profile::GetLastScripts(); if (lst.count() > 0) { QString sp = E2Profile::GetLastScripts().at(0); if (sp.length() > 0) { script_name = sp; SetAppBusy(); CmdRunScript(); SetAppReady(); } } } } #endif void e2CmdWindow::onLoadScript() { if (IsAppReady()) { SetAppBusy(); int rv = OpenScript(""); if (rv == OK) { rv = CmdRunScript(); if (rv != BADPARAM && rv != FILENOTFOUND) //rv != CMD_SCRIPTERROR { E2Profile::SetLastScript(script_name); UpdateScriptMenu(); } } SetAppReady(); } } #if 0 void e2CmdWindow::onNew() { if (IsAppReady()) { // EK 2017 // this feature is deactivated now // start new application // theApp->NewAppWin(0, "", // theApp->DefaultWidth(), theApp->DefaultHeight(), 0); } } #endif void e2CmdWindow::onReset() { if (IsAppReady()) { CmdReset(); } } void e2CmdWindow::onHelp() { if (IsAppReady()) { CmdHelp(); } } void e2CmdWindow::onReadCalibration() { if (IsAppReady()) { CmdReadCalibration(0); } } void e2CmdWindow::onAbout() { if (IsAppReady()) { About(); } } /** * @brief slot for popup window * */ void e2CmdWindow::onAboutQt() { QMessageBox::aboutQt(this, tr("About Qt")); } void e2CmdWindow::onReadSecurity(bool display_dialog) { if (IsAppReady()) { CmdReadSecurity(display_dialog); } } void e2CmdWindow::onCalibration() { if (IsAppReady()) { SetAppBusy(); CmdCalibration(); SetAppReady(); } } //void e2CmdWindow::onWriteSecurity() //{ // if (IsAppReady()) // { // CmdWriteSecurity(); // } //} void e2CmdWindow::onWriteHEndurance() { if (IsAppReady()) { CmdWriteSpecial(); } } void e2CmdWindow::onEditBufToggle() { bool b = actionEditBuferEnabled->isChecked(); e2HexEdit->setReadOnly(!b); e2HexEditSplit->setReadOnly(!b); E2Profile::SetEditBufferEnabled(b); // EK 2017 // TODO Draw(); } void e2CmdWindow::onEditNote() { if (IsAppReady()) { CmdEditNote(); } } void e2CmdWindow::onProgramOptions() { if (IsAppReady()) { ProgramOptions(); } } void e2CmdWindow::onSerialNumberOptions() { if (IsAppReady()) { SerialNumberOptions(); } } void e2CmdWindow::onSetSerialNumber() { if (IsAppReady()) { CmdSetSerialNumber(); } } void e2CmdWindow::onSelectEEPType(int val) { if (IsAppReady()) { CmdSetDeviceType(val); } } void e2CmdWindow::onEEPSubType(int val) { if (IsAppReady()) { CmdSetDeviceSubType(val); } } void e2CmdWindow::onAskToSave() { if (IsBufChanged()) { QString str; str = translate(STR_BUFCHANGED); str.replace("%s", GetFileName()); QMessageBox msgBox(QMessageBox::Warning, "PonyProg", str, QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { SaveFile(); } } } // void e2CmdWindow::onProgress(int val) // { // e2Prg->setValue(val); // } //void e2CmdWindow::onCloseAllDialog() //{ // e2Prg->close(); // e2Dlg->CloseDialog(); //} void e2CmdWindow::onOscCalibOption() { if (IsAppReady()) { OscCalibOption(); } } void e2CmdWindow::onProgram() { if (IsAppReady()) { SetAppBusy(); CmdProgram(); SetAppReady(); } } void e2CmdWindow::onSpecialBits() { if (IsAppReady()) { SpecialBits(); } } void e2CmdWindow::onDoubleSize() { if (IsAppReady()) { //CmdDoubleSize(val, cType); CmdDoubleSize(); } } void e2CmdWindow::onClearBuf() { if (IsAppReady()) { CmdClearBuf(); } } void e2CmdWindow::onFillBuf() { if (IsAppReady()) { CmdFillBuf(); } } void e2CmdWindow::onByteSwap() { if (IsAppReady()) { CmdByteSwap(); } } static bool CmpExtension(const QString &name, const QString &ext); int e2CmdWindow::CmdSave(int type, const QString &fname, long relocation) { int result = OK; QString oldfname = ""; if (awip->IsBufferValid()) { UpdateBuffer(); oldfname = awip->GetFileName(); awip->SetSaveRelocation(relocation); awip->SetSaveType(type); if (fname.length()) { awip->SetFileName(fname); } result = SaveFile(0); } else { result = CMD_NOTHINGTOSAVE; if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Warning", translate(STR_NOTHINGSAVE), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } if (result == OK && oldfname != awip->GetFileName()) { E2Profile::SetLastFile(awip->GetFileName(), awip->GetSaveType()); UpdateFileMenu(); } return result; } int e2CmdWindow::CmdSaveAs(int type, long relocation) { int result = OK; QString oldfname = ""; if (awip->IsBufferValid()) { UpdateBuffer(); oldfname = awip->GetFileName(); awip->SetSaveRelocation(relocation); awip->SetSaveType(type); result = SaveFile(1); } else { result = CMD_NOTHINGTOSAVE; if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Warning", translate(STR_NOTHINGSAVE), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } if (result == OK && oldfname != awip->GetFileName()) { E2Profile::SetLastFile(awip->GetFileName(), awip->GetSaveType()); UpdateFileMenu(); } return result; } int e2CmdWindow::CmdLastFile(int index) { int result = OK; if (verbose == verboseAll) { if (IsBufChanged() && awip->IsBufferValid()) { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), "Buffer changed. Save it before to close?", //TODO: translate message QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { awip->SetSaveType(ALL_TYPE); //?? SaveFile(); } } } int data_type; QString s = E2Profile::GetLastFile(data_type, index); if (s.length()) { awip->SetLoadType(data_type); awip->SetLoadAutoClearBuf(E2Profile::GetClearBufBeforeLoad()); result = OpenFile(s); } return result; } int e2CmdWindow::CmdReload() { int result = OK; if (verbose == verboseAll) { if (IsBufChanged() && awip->IsBufferValid()) { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), "Buffer changed. Save it before to close?", //TODO: translate message QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { awip->SetSaveType(ALL_TYPE); //?? SaveFile(); } } } /** //solo nel caso in cui il penultimo file era un .hex e l'ultimo // un .eep (caso dell'AVR con caricamento Flash+eeprom), ricarica // entrambi i file in sequenza, in caso contrario ricarica solo // l'ultimo. int data_type; if ( GetPrevFile(data_type) && FileExist(GetPrevFile(data_type)) && CmpExtension(GetLastFile(data_type), ".eep") == 0 && CmpExtension(GetPrevFile(data_type), ".hex") == 0 ) **/ int dt1, dt2; QString sp1 = E2Profile::GetLastFile(dt1, 0); if (sp1.length() && QFile::exists(sp1)) { QString sp2 = E2Profile::GetLastFile(dt2, 1); // We reload both files only if PrevFile is not E2P and last file is // not ALL_TYPE // because we don't want PrevFile change the selected device. In // case of LastFile is ALL_TYPE there's no need to reload even // PrevFile if (sp2.length() && QFile::exists(sp2) && dt1 != ALL_TYPE && CmpExtension(sp2.toLower(), ".e2p") != 0) { awip->SetLoadType(dt2); awip->SetLoadAutoClearBuf(E2Profile::GetClearBufBeforeLoad()); result = OpenFile(sp2); if (result == OK) { awip->SetLoadType(dt1); result = OpenFile(sp1); } } else { awip->SetLoadType(dt1); awip->SetLoadAutoClearBuf(E2Profile::GetClearBufBeforeLoad()); result = OpenFile(sp1); } } else { result = CMD_NOTHINGTOLOAD; if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Warning", translate(STR_NOTHINGLOAD), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } return result; } int e2CmdWindow::CmdPrint() { if (awip->IsBufferValid()) { Print(); } else { QMessageBox note(QMessageBox::Warning, "Warning", translate(STR_NOTHINGPRINT), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } return OK; } int e2CmdWindow::PlaySoundMsg(bool val) { if (val) { QSound::play(GetOkSound()); } return OK; } int e2CmdWindow::CmdHelp() { QString str; QFile file(GetHelpFile()); if (file.exists()) { str = GetHelpFile(); QDesktopServices::openUrl(QUrl::fromLocalFile(str)); } else { // str = "http://www.lancos.com/e2p/ponyprog2000.html"; QDesktopServices::openUrl(QUrl("http://www.lancos.com/e2p/ponyprog2000.html")); } #if 0 #ifdef Q_OS_LINUX //system(str.toLatin1().constData()); QProcess::execute("xdg-open", (QStringList() << str)); #else ShellExecute(NULL, L"open", (LPCWSTR)str.utf16(), NULL, NULL, SW_SHOWNORMAL); #endif #endif return OK; } int e2CmdWindow::CmdCalibration() { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), translate(STR_BUSCALIBRA1) + QString(APP_NAME) + translate(STR_BUSCALIBRA2), QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { int err = Calibration(); if (err == OK) { QMessageBox note(QMessageBox::Information, "Calibration", translate(STR_BUSCALIBRAOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); UpdateStatusBar(); } else { QString str; str = QString("%1 (%2)").arg(translate(STR_BUSCALIBRAFAIL)).arg(err); QMessageBox note(QMessageBox::Critical, "Calibration", str, QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } return OK; } // int e2CmdWindow::CmdWrite(int type) // { // int res; // SetAppBusy(); // res = CmdWrite(type, E2Profile::GetVerifyAfterWrite()); // SetAppReady(); // return res; // } int e2CmdWindow::CmdRead(int type) { if (IsBufChanged() && awip->IsBufferValid() && verbose == verboseAll) { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), translate(STR_BUFCHANGED3), QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { awip->SetSaveType(ALL_TYPE); //??? SaveFile(); } } ClearIgnoreFlag(); int result; int rval; int retry_flag = 1; while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGREADING)); awip->SetFileName(""); SetTitle(); rval = awip->Read(type); e2Prg->reset(); first_line = 0; //curIndex = 0; Draw(); if (rval > 0) { QString sp; //sp = GetEEPTypeString(awip->GetEEPPriType(), awip->GetEEPSubType()); sp = GetEEPTypeString(awip->GetEEPId()); //qDebug() << "CmdRead" << awip->GetEEPPriType() << awip->GetEEPSubType() << sp; UpdateStrFromStr(sp, ""); awip->RecalcCRC(); UpdateStatusBar(); QString str; str = QString("%1 %2 Byte").arg(translate(STR_MSGREADOK)).arg(GetDevSize()); if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Read", str, QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else { qDebug() << "CmdWindow->Read -- Error"; result = rval; if (verbose != verboseNo) { rval = OnError(rval); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } } //while (retry_flag) ClearIgnoreFlag(); return result; } int e2CmdWindow::CmdWrite(int type, bool verify) { int result = OK; int old_type = type; if (verify) { type &= ~CONFIG_TYPE; } if (!awip->IsBufferValid()) { if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Write", translate(STR_NOTHINGWRITE), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } result = CMD_NOTHINGTOWRITE; } else { if ((verbose != verboseAll) || (QMessageBox::warning(this, QString(APP_NAME), translate(STR_ASKWRITE), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)) { int rval; int retry_flag = 1; UpdateBuffer(); ClearIgnoreFlag(); while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGWRITING)); rval = awip->Write(type, true, verify ? true : false); if (rval > 0) { if (verify) { doProgress(translate(STR_MSGVERIFING)); if ((old_type & CONFIG_TYPE) && !(awip->GetFuseBits() == 0 && awip->GetLockBits() == 0)) { rval = awip->Verify(type, false, true); if (rval > 0) { //e2Prg->UpdateDialog(0, translate(STR_MSGWRITINGFUSE)); rval = awip->Write(CONFIG_TYPE, false, true); if (rval > 0) { rval = awip->Verify(CONFIG_TYPE, false, false); } } } else { rval = awip->Verify(type, false, false); } } e2Prg->reset(); if (rval > 0) //23/10/1999 { first_line = 0; Draw(); if (GetDevSize() == 0) { QString sp; //sp = GetEEPTypeString(awip->GetEEPPriType(), awip->GetEEPSubType()); sp = GetEEPTypeString(awip->GetEEPId()); //qDebug() << "CmdWrite" << awip->GetEEPPriType() << awip->GetEEPSubType() << sp; UpdateStrFromStr(sp); } awip->RecalcCRC(); UpdateStatusBar(); if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Write", translate(STR_MSGWRITEOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else if (rval == 0) { if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Write", translate(STR_MSGWRITEFAIL), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } result = CMD_WRITEFAILED; } else { if (verbose != verboseNo) { OnError(rval, translate(STR_MSGWRITEFAIL)); } result = rval; } } // if ( (rval = ... else { e2Prg->reset(); result = rval; if (verbose != verboseNo) { rval = OnError(rval, translate(STR_MSGWRITEFAIL)); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } // if (verbose != verboseNo) } } // while (retry_flag) ClearIgnoreFlag(); } // if ( yn.AskYN(... } //else return result; } int e2CmdWindow::CmdReadCalibration(int idx) { ClearIgnoreFlag(); int result; int rval = 0xFF; int retry_flag = 1; while (retry_flag) { result = OK; retry_flag = 0; long loc; int size; bool mtype; bool enabled; loc = 0; size = 1; mtype = false; enabled = false; E2Profile::GetCalibrationAddress(enabled, loc, size, mtype); if (mtype) { loc += awip->GetSplittedInfo(); } rval = awip->ReadOscCalibration(idx); if (rval >= 0) { if (enabled && (size > 0 && size <= 4) && (loc + size <= awip->GetBufSize()) ) { uint8_t *bp = awip->GetBufPtr() + loc; *bp = (uint8_t)rval; awip->RecalcCRC(); //awip->BufChanged(); // EK 2017 // TODO Draw(); UpdateStatusBar(); if (verbose == verboseAll) { QString str; str = translate(STR_MSGREADCALIBOK) + QString().sprintf(": 0x%02X (%d)", rval, rval); QMessageBox note(QMessageBox::Information, "Calibration", str, QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else { result = BADPARAM; if (verbose != verboseNo) { rval = OnError(result); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } } else { result = rval; if (verbose != verboseNo) { rval = OnError(rval); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } } //while (retry_flag) ClearIgnoreFlag(); return result; } int e2CmdWindow::CmdErase(int type) { ClearIgnoreFlag(); int result; int rval; int retry_flag = 1; while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGERASING)); rval = awip->Erase(type); e2Prg->reset(); if (rval > 0) { //CmdClearBuf(); if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Warning", translate(STR_MSGERASEOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else { //first_line = 0; //curIndex = 0; //Draw(); qDebug() << "CmdWindow->Erase -- Error"; result = rval; if (verbose != verboseNo) { rval = OnError(rval); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } } //while (retry_flag) ClearIgnoreFlag(); return result; } int e2CmdWindow::CmdVerify(int type) { int result = OK; if (!awip->IsBufferValid()) { if (verbose != verboseNo) { QMessageBox note(QMessageBox::Information, "Warning", translate(STR_NOTHINGVERIFY), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } result = CMD_NOTHINGTOVERIFY; } else { doProgress(translate(STR_MSGVERIFING)); int rval = awip->Verify(type); e2Prg->reset(); if (rval < 0) { result = rval; if (verbose != verboseNo) { OnError(rval, translate(STR_MSGVERIFYFAIL1)); } } else if (rval == 0) { result = CMD_VERIFYFAILED; if (verbose != verboseNo) { QMessageBox note(QMessageBox::Critical, "Verify", translate(STR_MSGVERIFYFAIL2), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } else { result = OK; if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Verify", translate(STR_MSGVERIFYOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } } return result; } int e2CmdWindow::CmdProgram() { int result = OK; int prog_opt = E2Profile::GetProgramOptions(); VerboseType old_verbose = verbose; if (verbose == verboseAll) { verbose = verboseErr; //Disable all ok messages } if ((prog_opt & RELOAD_YES)) { result = CmdReload(); } if (result == OK && (prog_opt & READFLASH_YES)) { result = CmdRead(PROG_TYPE); } if (result == OK && (prog_opt & READEEP_YES)) { result = CmdRead(DATA_TYPE); } if (result == OK && (prog_opt & BYTESWAP_YES)) { result = CmdByteSwap(); } if (result == OK && (prog_opt & SETID_YES)) { result = CmdSetSerialNumber(); } if (result == OK && (prog_opt & READOSCAL_YES)) { result = CmdReadCalibration(0); } if (result == OK && (prog_opt & ERASE_YES)) { result = CmdErase(ALL_TYPE); } if (result == OK && (prog_opt & FLASH_YES)) { result = CmdWrite(PROG_TYPE, true); } if (result == OK && (prog_opt & EEPROM_YES)) { result = CmdWrite(DATA_TYPE, true); } if (result == OK && (prog_opt & LOCK_YES)) { result = CmdWriteSecurity(); } verbose = old_verbose; if (result == OK) { if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Program", translate(STR_MSGPROGRAMOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else { if (verbose != verboseNo) { QString str; str = translate(STR_MSGPROGRAMFAIL) + QString().sprintf(" (%d)", result); QMessageBox note(QMessageBox::Critical, "Program", str, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } return result; } #if 0 //** // TODO to QString static char *mytokenizer(char *buf, char *&next) { char *sp = buf; char *spend = NULL; if (sp == NULL) // || next == NULL) { return NULL; } //ignore spaces, tabs, new-line, carriage return while (*sp == ' ' || *sp == '\t' || *sp == '\n' || *sp == '\r') { sp++; } if (*sp == '\0') { return NULL; } if (*sp == '\"') { sp++; spend = strchr(sp, '\"'); //Substitute string "\n" char with 0x0A 0x32 char *s1; for (s1 = sp; s1 < spend; s1++) { if (s1[0] == '\\' && s1[1] == 'n') { s1[0] = '\n'; s1[1] = ' '; } } } else { char *s1, *s2; s1 = strchr(sp, '\t'); s2 = strchr(sp, ' '); if (s1 != NULL && s2 != NULL) { if (s1 < s2) { spend = s1; } else { spend = s2; } } else if (s1 != NULL && s2 == NULL) { spend = s1; } else if (s2 != NULL && s1 == NULL) { spend = s2; } else { spend = strchr(sp, '\n'); } } if (spend != NULL) { *spend++ = '\0'; if (*spend == '\0') { next = NULL; } else { next = spend; } } else { next = NULL; } return sp; } #endif // TODO to QString static QStringList myscantokenizer(char *buf)//, char *arg[], int arglen) { QString ln = buf; ln = ln.simplified(); QStringList l; if (ln.size() > 0) { l = ln.split(" "); } return l; #if 0 int k; char *sp, *next; if (arg == NULL) { return 0; } for (k = 0; k < arglen; k++) { arg[k] = NULL; } sp = buf; for (k = 0; (sp = mytokenizer(sp, next)) != NULL && k < arglen; k++) { arg[k] = sp; sp = next; } return k; #endif } // #define cmdbuf arg[0] int e2CmdWindow::ScriptError(int line_number, int arg_index, const QString &s, const QString msg) { QString str; //if (s.length() == 0) //{ // arg = ""; //} if (arg_index == 0) { str = QString("%1 %2: %3 '%4'").arg(translate(STR_MSGSCRIPTERROR)).arg(line_number).arg(msg.length() ? msg : translate(STR_MSGSCRIPTBADCOMMAND)).arg(s); } else if (s.length() == 0) { str = QString("%1 %2: %3").arg(translate(STR_MSGSCRIPTERROR)).arg(line_number).arg(msg.length() ? msg : translate(STR_MSGSCRIPTARGMISSING)); } else { str = QString("%1 %2: %3 '%4'").arg(translate(STR_MSGSCRIPTERROR)).arg(line_number).arg(msg.length() ? msg : translate(STR_MSGSCRIPTBADARGUMENT)).arg(s); } QMessageBox note(QMessageBox::Critical, "Script Error", str, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); return CMD_SCRIPTERROR; } int e2CmdWindow::CmdRunScript(bool test_mode) { int result = OK; char buf[512]; int linecounter; VerboseType old_verbose = verbose; if (verbose == verboseAll) { verbose = verboseErr; //Disable all ok messages } if (script_name.length() == 0) { return BADPARAM; } QString fpath = QFileInfo(script_name).absolutePath(); qDebug() << "Set current path: " << fpath; QDir::setCurrent(fpath); QFile fh(script_name); if (!fh.open(QIODevice::ReadOnly | QIODevice::Text)) { return FILENOTFOUND; } linecounter = 0; while (result == OK && !fh.atEnd()) { fh.readLine(buf, sizeof(buf) - 1); linecounter++; if (buf[0] == '#') //Skip comments { continue; } QStringList lst = myscantokenizer(buf); int n = lst.count(); if (n == 0) { //Line empty: do nothing continue; } QString cmdbuf = lst.at(0).toUpper(); if (cmdbuf == "SELECTDEVICE") { if (n == 2) { long new_type; new_type = GetEEPTypeFromString(lst.at(1)); if (new_type <= 0) { result = ScriptError(linecounter, 1, lst.at(1)); } else { if (!test_mode) { result = CmdSelectDevice(new_type); } } } else //Argument missing { result = ScriptError(linecounter, 1, lst.at(1)); } } else if (cmdbuf == "LOAD-ALL") { if (n >= 2) { long reloc_off = 0; bool ok = true; if (n >= 3) { reloc_off = lst.at(2).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 2, lst.at(2)); } } if (ok && !QFile::exists(lst.at(1))) { ok = false; result = ScriptError(linecounter, 1, lst.at(1), translate(STR_MSGFILENOTFOUND)); } if (ok && !test_mode) { result = CmdOpen(ALL_TYPE, lst.at(1), reloc_off, 0); //Don't clear buffer before load on script } } else if (n == 1) { if (!test_mode) { result = CmdOpen(ALL_TYPE); } } } else if (cmdbuf == "LOAD-PROG") { if (n >= 2) { long reloc_off = 0; bool ok = true; if (n >= 3) { reloc_off = lst.at(2).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 2, lst.at(2)); } } if (ok && !QFile::exists(lst.at(1))) { ok = false; result = ScriptError(linecounter, 1, lst.at(1), translate(STR_MSGFILENOTFOUND)); } if (ok && !test_mode) { result = CmdOpen(PROG_TYPE, lst.at(1), reloc_off, 0); //Don't clear buffer before load on script } } else if (n == 1) { if (!test_mode) { result = CmdOpen(PROG_TYPE); } } } else if (cmdbuf == "LOAD-DATA") { if (n >= 2) { long reloc_off = 0; bool ok = true; if (n >= 3) { reloc_off = lst.at(2).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 2, lst.at(2)); } } if (ok && !QFile::exists(lst.at(1))) { ok = false; result = ScriptError(linecounter, 1, lst.at(1), translate(STR_MSGFILENOTFOUND)); } if (ok && !test_mode) { result = CmdOpen(DATA_TYPE, lst.at(1), reloc_off, 0); //Don't clear buffer before load on script } } else if (n == 1) { if (!test_mode) { result = CmdOpen(DATA_TYPE); } } } else if (cmdbuf == "SAVE-ALL") { if (n >= 2) { if (n >= 3) { QString tp = lst.at(2).toLower(); if (tp == "e2p") { awip->SetFileBuf(E2P); } else if (tp == "bin") { awip->SetFileBuf(BIN); } else if (tp == "csm") { awip->SetFileBuf(CSM); } else if (tp == "intel-hex") { awip->SetFileBuf(INTEL); } else if (tp == "mot-srec") { awip->SetFileBuf(MOTOS); } else { result = ScriptError(linecounter, 2, lst.at(2)); } } if (result == OK && !test_mode) { if (lst.at(1) == "--") { result = CmdSaveAs(ALL_TYPE); } else { result = CmdSave(ALL_TYPE, lst.at(1).toLatin1()); } } } else if (n == 1) { if (!test_mode) { result = CmdSave(ALL_TYPE); } } } else if (cmdbuf == "SAVE-PROG") { if (n >= 2) { if (n >= 3) { QString tp = lst.at(2).toLower(); if (tp == "e2p") { awip->SetFileBuf(E2P); } else if (tp == "bin") { awip->SetFileBuf(BIN); } else if (tp == "csm") { awip->SetFileBuf(CSM); } else if (tp == "intel-hex") { awip->SetFileBuf(INTEL); } else if (tp == "mot-srec") { awip->SetFileBuf(MOTOS); } else { result = ScriptError(linecounter, 2, lst.at(2)); } } if (result == OK && !test_mode) { if (lst.at(1) == "--") { result = CmdSaveAs(PROG_TYPE); } else { result = CmdSave(PROG_TYPE, lst.at(1).toLatin1().constData()); } } } else if (n == 1) { if (!test_mode) { result = CmdSave(PROG_TYPE); } } } else if (cmdbuf == "SAVE-DATA") { if (n >= 2) { if (n >= 3) { QString tp = lst.at(2).toLower(); if (tp == "e2p") { awip->SetFileBuf(E2P); } else if (tp == "bin") { awip->SetFileBuf(BIN); } else if (tp == "csm") { awip->SetFileBuf(CSM); } else if (tp == "intel-hex") { awip->SetFileBuf(INTEL); } else if (tp == "mot-srec") { awip->SetFileBuf(MOTOS); } else { result = ScriptError(linecounter, 2, lst.at(2)); } } if (result == OK && !test_mode) { if (lst.at(1) == "--") { result = CmdSaveAs(DATA_TYPE); } else { result = CmdSave(DATA_TYPE, lst.at(1).toLatin1()); } } } else if (n == 1) { if (!test_mode) { result = CmdSave(DATA_TYPE); } } } else if (cmdbuf == "READ-ALL") { if (!test_mode) { result = CmdRead(ALL_TYPE); } } else if (cmdbuf == "READ-PROG") { if (!test_mode) { result = CmdRead(PROG_TYPE); } } else if (cmdbuf == "READ-DATA") { if (!test_mode) { result = CmdRead(DATA_TYPE); } } else if (cmdbuf == "WRITE&VERIFY-ALL") { if (!test_mode) { result = CmdWrite(ALL_TYPE, true); } } else if (cmdbuf == "WRITE&VERIFY-PROG") { if (!test_mode) { result = CmdWrite(PROG_TYPE, true); } } else if (cmdbuf == "WRITE&VERIFY-DATA") { if (!test_mode) { result = CmdWrite(DATA_TYPE, true); } } else if (cmdbuf == "WRITE-ALL") { if (!test_mode) { result = CmdWrite(ALL_TYPE, false); } } else if (cmdbuf == "WRITE-PROG") { if (!test_mode) { result = CmdWrite(PROG_TYPE, false); } } else if (cmdbuf == "WRITE-DATA") { if (!test_mode) { result = CmdWrite(DATA_TYPE, false); } } else if (cmdbuf == "ERASE-ALL") { if (!test_mode) { result = CmdErase(ALL_TYPE); } } else if (cmdbuf == "VERIFY-ALL") { if (!test_mode) { result = CmdVerify(ALL_TYPE); } } else if (cmdbuf == "VERIFY-PROG") { if (!test_mode) { result = CmdVerify(PROG_TYPE); } } else if (cmdbuf == "VERIFY-DATA") { if (!test_mode) { result = CmdVerify(DATA_TYPE); } } else if (cmdbuf == "WRITE-FUSE") { if (n >= 2) { bool ok; long fuse = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { awip->SetFuseBits(fuse); result = CmdWriteSpecial(); } } else if (n == 1) { if (!test_mode) { result = CmdWriteSpecial(); } } } else if (cmdbuf == "SET-FUSE") { if (n >= 2) { bool ok; long fuse = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { awip->SetFuseBits(fuse); } } else //Argument missing { result = ScriptError(linecounter, 1, lst.at(1)); } } else if (cmdbuf == "WRITE-LOCK") { if (n >= 2) { bool ok; long lock = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { awip->SetLockBits(lock); result = CmdWriteLock(); } } else if (n == 1) { if (!test_mode) { result = CmdWriteLock(); } } } else if (cmdbuf == "SET-LOCK") { if (n >= 2) { bool ok; long lock = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { awip->SetLockBits(lock); } } else //Argument missing { result = ScriptError(linecounter, 1, lst.at(1)); } } else if (cmdbuf == "EDIT-SECURITY") { if (!test_mode) { result = SpecialBits(); } } else if (cmdbuf == "READ-FUSE") { if (!test_mode) { result = CmdReadSpecial(); } } else if (cmdbuf == "READ-LOCK") { if (!test_mode) { result = CmdReadLock(); } } else if (cmdbuf == "SERIALNUMBER") { if (n >= 2) { bool ok = false; long sernum = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { E2Profile::SetSerialNumVal(sernum); } } if (n >= 3) { long start = 0; int size = 1; bool mtype = false; E2Profile::GetSerialNumAddress(start, size, mtype); bool ok = false; start = lst.at(2).toLong(&ok, 0); //address location if (!ok) { result = ScriptError(linecounter, 2, lst.at(2)); } if (ok && n >= 4) { size = lst.at(3).toInt(&ok); //address size if (!ok) { result = ScriptError(linecounter, 3, lst.at(3)); } } if (ok && n >= 5) { if (lst.at(4) == "DATA") //offset { mtype = true; } } if (ok && !test_mode) { E2Profile::SetSerialNumAddress(start, size, mtype); } if (ok && n >= 6) { FmtEndian fmt; fmt = E2Profile::GetSerialNumFormat(); if ("LITTLEENDIAN" == lst.at(5)) { fmt = FMT_LITTLE_ENDIAN; } else { fmt = FMT_BIG_ENDIAN; } if (!test_mode) { E2Profile::SetSerialNumFormat(fmt); } } if (ok && n >= 7) { bool autoinc = E2Profile::GetSerialNumAutoInc(); if (n >= 7) { autoinc = ("NO" == lst.at(6)) ? false : true; } if (!test_mode) { E2Profile::SetSerialNumAutoInc(autoinc); } } if (ok && !test_mode) { result = CmdSetSerialNumber(); } } } else { //READ-CALIBRATION
[mem][osc_index] if (cmdbuf == "READ-CALIBRATION") { long start = 0; int size = 1; bool mtype = false; bool enabled = false; E2Profile::GetCalibrationAddress(enabled, start, size, mtype); int osc_index = 0; bool ok = true; if (n >= 2) { start = lst.at(1).toLong(&ok, 0); //address location if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } if (n >= 3) { if (lst.at(2) == "DATA") //offset { mtype = true; } } if (ok && !test_mode) { E2Profile::SetCalibrationAddress(enabled, start, size, mtype); } if (ok && n >= 4) { osc_index = lst.at(3).toInt(&ok); //address size if (!ok) { result = ScriptError(linecounter, 3, lst.at(3)); } } } if (ok && !test_mode) { result = CmdReadCalibration(osc_index); } } else if (cmdbuf == "BYTESWAP") { if (!test_mode) { result = CmdByteSwap(); } } else if (cmdbuf == "RESET") { if (!test_mode) { result = CmdReset(); } } else if (cmdbuf == "CLEARBUFFER" || cmdbuf == "CLEARBUF-ALL") { if (!test_mode) { result = CmdClearBuf(ALL_TYPE); } } else if (cmdbuf == "CLEARBUF-PROG") { if (!test_mode) { result = CmdClearBuf(PROG_TYPE); } } else if (cmdbuf == "CLEARBUF-DATA") { if (!test_mode) { result = CmdClearBuf(DATA_TYPE); } } else if (cmdbuf == "FILLBUFFER") { if (n >= 4) { long val, from = 0, to = 0; bool ok = true; val = lst.at(1).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else { from = lst.at(2).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 2, lst.at(2)); } else { to = lst.at(3).toLong(&ok, 0); if (!ok) { result = ScriptError(linecounter, 3, lst.at(3)); } } } if (ok) { if (from < to && from >= 0) { if (!test_mode) { awip->FillBuffer(from, val, to - from + 1); // EK 2017 // TODO Draw(); UpdateStatusBar(); } } else { result = ScriptError(linecounter, 2, lst.at(2)); } } } else if (n == 1) { if (!test_mode) { result = CmdFillBuf(); } } else { result = ScriptError(linecounter, 3, lst.at(3)); } } else if (cmdbuf == "PAUSE") { QString s; if (n >= 2) { s = lst.at(1); } else { s = translate(STR_MSGDEFAULTPAUSE); } if (!test_mode) { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), s, QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { result = OK; } else { result = OP_ABORTED; } } } else if (cmdbuf == "CALL") { if (n >= 2) { if (!test_mode) { //Warning! security risk! #if 0 vOS os; result = os.vRunProcess(lst.at(1), 0, 0, /*Wait*/ 1, /*minimize*/ 0); if (result == 99) { result = ScriptError(linecounter, 1, lst.at(1), translate(STR_MSGFILENOTFOUND)); } #else QStringList alst = lst; alst.removeFirst(); alst.removeFirst(); QProcess process; process.start(lst.at(1), alst); if (!process.waitForStarted(500)) { result = ScriptError(linecounter, 1, lst.at(1), translate(STR_MSGFILENOTFOUND)); } else { process.waitForFinished(1000); } #endif } } else //Argument missing { result = ScriptError(linecounter, 1, lst.at(1)); } } else if (cmdbuf == "DELAY") { if (n >= 2) { bool ok = false; long msec = lst.at(1).toInt(&ok); if (!ok) { result = ScriptError(linecounter, 1, lst.at(1)); } else if (!test_mode) { Wait w; w.WaitMsec(msec); } } else { //Bad argument result = ScriptError(linecounter, 1, lst.at(1)); } } else { result = ScriptError(linecounter, 0, lst.at(0)); //Bad command } } } //while //If in scriptMode don't restore the normal verbose yet if (!scriptMode && !test_mode) { verbose = old_verbose; } if (result == OK) { if (verbose == verboseAll) { QMessageBox note(QMessageBox::Information, "Script information", translate(STR_MSGPROGRAMOK), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else if (result == OP_ABORTED) { if (verbose == verboseAll) { QMessageBox note(QMessageBox::Warning, "Script information", translate(STR_OPABORTED), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else if (result == CMD_SCRIPTERROR) { if (verbose == verboseAll) { QMessageBox note(QMessageBox::Critical, "Script information", translate(STR_SCRIPTERROR), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } else { if (verbose != verboseNo) { QString str; str = translate(STR_MSGPROGRAMFAIL) + QString().sprintf(" (%d)", result); QMessageBox note(QMessageBox::Critical, "Script information", str, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } verbose = old_verbose; return result; } int e2CmdWindow::CmdGetInfo() { long fsize, esize, tsize; tsize = GetDevSize(); fsize = awip->GetSplittedInfo(); if (fsize == tsize) { fsize = 0; } esize = tsize - fsize; int pritype = GetE2PPriType(awip->GetEEPId()); if (pritype == E24XX || pritype == E24XX2 || pritype == E24XX5) { // uint32_t hblock, secbits; int rlv; if (pritype != E24XX) { rlv = 3; } else { rlv = awip->GetBankRollOver(); if (rlv == 0) { // vYNReplyDialog yn(this); QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), QString(translate(STR_MSGBANKROLLOVER)), QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { rlv = awip->BankRollOverDetect(1); } } } // awip->SecurityRead(secbits); // awip->HighEnduranceRead(hblock); e24xx_infoModalDialog info(this, rlv, awip->GetCRC(), tsize); info.exec(); } else { other_infoModalDialog info(this, fsize, esize, awip->GetCRC()); info.exec(); } return OK; } int e2CmdWindow::CmdReset() { awip->Reset(); if (verbose == verboseAll) { QMessageBox note(QMessageBox::Warning, "Reset", translate(STR_MSGDEVRESET), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } return OK; } int e2CmdWindow::CmdDoubleSize() { if (!awip->IsBufferValid()) { QMessageBox note(QMessageBox::Warning, "Double size", translate(STR_BUFEMPTY), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } else { // Double the size // long new_type = GetEEPTypeFromSize(awip->GetEEPPriType(), awip->GetNoOfBlock() * 2); long new_type = GetEEPTypeFromSize(awip->GetEEPId(), awip->GetNoOfBlock() * 2); if (new_type > 0) { awip->DoubleSize(); CmdSelectDevice(new_type); } else { QMessageBox note(QMessageBox::Warning, "Not supported", translate(STR_OPNOTSUP), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } return OK; } int e2CmdWindow::CmdSetDeviceType(int val) { long new_type = CbxIdToType(val, 0); awip->SetEEProm(new_type); qDebug() << "CmdSetDeviceType(" << val << "), type=" << (hex) << new_type << (dec); return CmdSelectDevice(new_type); } int e2CmdWindow::CmdSetDeviceSubType(int val) { int v1 = cbxEEPType->currentIndex(); long new_type = CbxIdToType(v1, val); qDebug() << "CmdSetDeviceSubType(" << val << "), v1=" << v1 << ", type=" << (hex) << new_type << (dec); return CmdSelectDevice(new_type); } int e2CmdWindow::CmdOpen(int type, const QString &fname, long relocation, int clear_buffer) { int result = OK; QString oldfname = awip->GetFileName(); if (IsBufChanged() && awip->IsBufferValid() && verbose == verboseAll) { QMessageBox msgBox(QMessageBox::Warning, QString(APP_NAME), translate(STR_BUFCHANGED2), QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { awip->SetSaveType(ALL_TYPE); SaveFile(); } } awip->SetLoadType(type); awip->SetLoadRelocation(relocation); if (clear_buffer != -1) { awip->SetLoadAutoClearBuf((clear_buffer == 0) ? false : true); } result = OpenFile(fname); if (result == OK && oldfname != awip->GetFileName()) { E2Profile::SetLastFile(awip->GetFileName(), awip->GetLoadType()); UpdateFileMenu(); } return result; } int e2CmdWindow::CmdClearBuf(int type) { //awip->FillBuffer(); awip->ClearBuffer(type); Draw(); UpdateStatusBar(); return OK; } // EK 2017 // TODO to check this int e2CmdWindow::CmdFillBuf() { static long fromAddr = 0, toAddr = 0xFFFF; static int val = 0xFF; FillDialog e2Fill(this, fromAddr, toAddr, val, awip->GetBufSize()/*, translate(STR_MSGINSPARAM)*/); if (e2Fill.exec() == QDialog::Accepted) { if (fromAddr <= toAddr) { awip->FillBuffer(fromAddr, val, toAddr - fromAddr + 1); // awip->BufChanged(); moved into awip->FillBuffer() // EK 2017 // TODO Draw(); UpdateStatusBar(); } else { QMessageBox msgBox(QMessageBox::Warning, "Fill buffer", QString(translate(STR_MSGBADPARAM)), QMessageBox::Ok); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Ok, translate(STR_OK)); msgBox.exec(); } } return OK; } int e2CmdWindow::SpecialBits(bool readonly) { //int rval; //uint32_t lock, fuse; //If the current fuse settings is invalid try to read it from the device if (!awip->IsFuseValid()) { CmdReadSecurity(false); //call with 'false' to avoid recursion!!! } bool repeat; do { repeat = false; //lock = awip->GetLockBits(); //fuse = awip->GetFuseBits(); long type = awip->GetEEPId(); // BuildE2PType(awip->GetEEPPriType(), awip->GetEEPSubType()); if (type != E2464) { fuseModalDialog e2Fuse(this, awip, /*" ", type, lock, fuse, */readonly); int res = e2Fuse.exec(); if (res != QDialog::Rejected) { qDebug() << "fuse " << res; if (res == 2) // read //e2Fuse.isRead() == true) { CmdReadSecurity(false); repeat = true; } else { // ok or write // EK 2017 // implemented in fuse dialog //awip->SetLockBits(lock); //awip->SetFuseBits(fuse); if (res == 3) //Program { CmdWriteSecurity(); } } } } else { blockDialog e2Block(this, awip, /*" ", type, lock, fuse, */readonly); if (e2Block.exec() == QDialog::Accepted) { // EK 2017 // implemented in block dialog //awip->SetLockBits(lock); //awip->SetFuseBits(fuse); } } } while (repeat); return OK; } // EK 2017 // TODO ??? int e2CmdWindow::ProgramOptions() { // int rval; int reload, reep, erase, flash, eeprom, lock; // lock = awip->GetLockBits(); // fuse = awip->GetFuseBits(); progOptionDialog prog(this, awip->GetEEPId(), // BuildE2PType(awip->GetEEPPriType(), awip->GetEEPSubType()), reload, reep, erase, flash, eeprom, lock); if (prog.exec() == QDialog::Accepted) { // } #if 0 rval = prog.progAction(" ", BuildE2PType(awip->GetEEPPriType(), awip->GetEEPSubType()), reload, reep, erase, flash, eeprom, lock); if (rval != 0) //OK { // awip->SetLockBits(lock); // awip->SetFuseBits(fuse); // if (rval == 2) //Program // { // CmdWriteSecurity(); // } } #endif return OK; } int e2CmdWindow::SerialNumberOptions() { SerNumDialog dlg(this) ; //, loc, memtype, autoinc, fmt, size, val); dlg.exec(); return OK; } int e2CmdWindow::OscCalibOption() { OscCalibDialog dlg(this, awip); dlg.exec(); return OK; } int e2CmdWindow::CmdReadSecurity(bool display_dialog) { int result; result = CmdReadLock(); if (result == OK) { result = CmdReadSpecial(); if (result == OK && display_dialog) { SpecialBits(); } } return result; } int e2CmdWindow::CmdWriteSecurity() { int result; if (awip->GetEEPId() == AT90S4433 || awip->GetEEPId() == AT90S2333) { result = CmdWriteLock(); if (result == OK) { Wait w; w.WaitMsec(100); result = CmdWriteSpecial(); } } else { result = CmdWriteSpecial(); if (result == OK) { result = CmdWriteLock(); } } return result; } int e2CmdWindow::CmdWriteLock() { int result = OK; QMessageBox note; /** long type = BuildE2PType( awip->GetEEPPriType(), awip->GetEEPSubType() ); if (type == E2464) //implementazione per le Microchip 24C65 { vReplyDialog rp(this); // instantiate char r[100]; // a buffer for reply rp.Reply("Enter the first block ",r,99); if (*r) { int sb, nb; sb = atoi(r); rp.Reply("Enter the number of blocks ",r,99); if (*r) { if ((nb = atoi(r)) != 0) { char str[MAXMSG]; sprintf(str, "Security bits write successful (%d,%d)", sb, nb); int err = awip->SecurityWrite( ((sb << 4) & 0xF0) | (nb & 0x0F) ); if (err) { if (err == IICERR_NOADDRACK) note.setText("Device Not Responding"); else note.setText("Security bits write error"); } else { int val; awip->SecurityRead(val); if ( ((val >> 4) & 0x0F) != sb || (val & 0xF) != nb) note.setText("Security bits write failed"); else note.setText(str); } } else note.setText("Error"); } } } else **/ { int rval; int retry_flag = 1; ClearIgnoreFlag(); while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGWRITINGSEC)); rval = awip->SecurityWrite(0, true); e2Prg->reset(); if (rval == OK) { //if (verbose == verboseAll) // note.setText("Security bits write successful"); } // if ( (rval = ... else if (rval == NOTSUPPORTED) { } else { result = rval; if (verbose != verboseNo) { rval = OnError(rval, translate(STR_MSGWRITESECFAIL)); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } // if (verbose != verboseNo) } // else } // while (retry_flag) ClearIgnoreFlag(); } return result; } int e2CmdWindow::CmdReadLock() { int result = OK; uint32_t bits; ClearIgnoreFlag(); int rval; int retry_flag = 1; // long type = BuildE2PType( awip->GetEEPPriType(), awip->GetEEPSubType() ); while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGREADINGSEC)); rval = awip->SecurityRead(bits); e2Prg->reset(); if (rval == OK) { // EK 2017 // TODO Draw(); UpdateStatusBar(); // orig deactivated SpecialBits(); } // if ( (rval = ... else if (rval == NOTSUPPORTED) { } else { result = rval; if (verbose != verboseNo) { rval = OnError(rval, translate(STR_MSGREADSECFAIL)); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } // else } // while (retry_flag) ClearIgnoreFlag(); return result; } int e2CmdWindow::CmdReadSpecial() { int result = OK; uint32_t bits; ClearIgnoreFlag(); int rval; int retry_flag = 1; long type = awip->GetEEPId(); // BuildE2PType( awip->GetEEPPriType(), awip->GetEEPSubType() ); while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGREADINGFUSE)); if (type == E2464) { rval = awip->HighEnduranceRead(bits); } else { rval = awip->FusesRead(bits); } e2Prg->reset(); if (rval == OK) { // orig deactivated SpecialBits(1); } // if ( (rval = ... else if (rval == NOTSUPPORTED) { } else { result = rval; if (verbose != verboseNo) { rval = OnError(rval, translate(STR_MSGREADFUSEFAIL)); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } // else } // while (retry_flag) ClearIgnoreFlag(); return result; } // TODO E2464 int e2CmdWindow::CmdWriteSpecial() { int result = OK; QMessageBox note; long type = awip->GetEEPId(); //BuildE2PType( awip->GetEEPPriType(), awip->GetEEPSubType() ); /** if (type == E2464) //Microchip 24C65 high endurance block { vReplyDialog rp(this); // instantiate char r[100]; // a buffer for reply rp.Reply("Enter the high endurance block ",r,99); if (*r) { int a, err; a = atoi(r); if ( (err = awip->HighEnduranceWrite(a)) ) { if (err == IICERR_NOADDRACK) note.setText("Device Not Responding"); else note.setText("High endurance block write error"); } else { int hend = -1; awip->HighEnduranceRead(hend); if (hend != a) note.setText("High enduranche block write failed"); else { result = OK; note.setText("High endurance block write successful"); } } } } else **/ { int rval; int retry_flag = 1; ClearIgnoreFlag(); while (retry_flag) { result = OK; retry_flag = 0; doProgress(translate(STR_MSGWRITINGFUSE)); if (type == E2464) { rval = awip->HighEnduranceWrite(0, true); } else { rval = awip->FusesWrite(0, true); } e2Prg->reset(); if (rval == OK) { //if (verbose == verboseAll) // note.setText("Special write successful"); } // if ( (rval = ... else if (rval == NOTSUPPORTED) { } else { result = rval; if (verbose != verboseNo) { rval = OnError(rval, translate(STR_MSGWRITEFUSEFAIL)); if (rval == QMessageBox::Abort) //Abort { retry_flag = 0; ClearIgnoreFlag(); } if (rval == QMessageBox::Retry) //Retry { retry_flag = 1; ClearIgnoreFlag(); } else if (rval == QMessageBox::Ignore) //Ignore { retry_flag = 1; SetIgnoreFlag(); } } } // else } // while (retry_flag) ClearIgnoreFlag(); } return result; } int e2CmdWindow::CmdByteSwap() { int result = OK; if (!awip->IsBufferValid()) { result = CMD_BUFFEREMPTY; if (verbose != verboseNo) { QMessageBox note(QMessageBox::Information, "Byte swap", translate(STR_BUFEMPTY), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } else { awip->SwapBytes(); // EK 2017 // TODO Draw(); UpdateStatusBar(); } return result; } // EK 2017 // TODO check this int e2CmdWindow::CmdEditNote() { QString str1 = awip->GetStringID(); QString str2 = awip->GetComment(); notesModalDialog notes(this, str1, str2); if (notes.exec() == QDialog::Accepted) { UpdateStrFromStr(str1, str2); UpdateStatusBar(); } return OK; } // EK 2017 // new_type is the chip id int e2CmdWindow::CmdSelectDevice(long new_type, bool init) { awip->SetEEProm(new_type); UpdateMenuType(new_type); first_line = 0; //curIndex = 0; Draw(); awip->RecalcCRC(); UpdateStatusBar(); if (!init) { E2Profile::SetLastDevType(new_type); } return OK; } /** void e2CmdWindow::CmdRemoteMode() { VerboseType old_verbose = verbose; verbose = verboseNo; //No messages when running in remote mode e2Prg->setLabelText(translate(STR_MSGACCEPTCMD)); e2Prg->setValue(0); SocketServer srv(0, this); if ( srv.UDPMainLoop() != OK) //e2Prg->close(); emit onEndProgress(); verbose = old_verbose; } **/ int e2CmdWindow::CmdSetSerialNumber() { long loc = 0; int size = 1; uint32_t val = 0; bool memtype = false; val = E2Profile::GetSerialNumVal(); E2Profile::GetSerialNumAddress(loc, size, memtype); if (memtype) { loc += awip->GetSplittedInfo(); } if ((size > 0 && size <= 4) && (loc + size <= awip->GetBufSize())) { uint8_t *bp = awip->GetBufPtr() + loc; if (E2Profile::GetSerialNumFormat() == FMT_BIG_ENDIAN) { if (size > 3) { *bp++ = (uint8_t)((val >> 24) & 0xff); } if (size > 2) { *bp++ = (uint8_t)((val >> 16) & 0xff); } if (size > 1) { *bp++ = (uint8_t)((val >> 8) & 0xff); } if (size > 0) { *bp++ = (uint8_t)(val & 0xff); } } else { if (size > 0) { *bp++ = (uint8_t)(val & 0xff); } if (size > 1) { *bp++ = (uint8_t)((val >> 8) & 0xff); } if (size > 2) { *bp++ = (uint8_t)((val >> 16) & 0xff); } if (size > 3) { *bp++ = (uint8_t)((val >> 24) & 0xff); } } awip->RecalcCRC(); //awip->BufChanged(); if (E2Profile::GetSerialNumAutoInc()) { E2Profile::SetSerialNumVal(++val); } Draw(); UpdateStatusBar(); } return OK; } long e2CmdWindow::GetDevSize() const { return awip->GetSize() == AUTOSIZE_ID ? 0 : awip->GetSize(); } int e2CmdWindow::IsBufChanged() const { return awip->IsBufChanged(); } void e2CmdWindow::UpdateStatusBar() { //int is_splitted = awip->GetSplittedInfo() > 0 && awip->GetSplittedInfo() != awip->GetSize(); if (lblStringID == NULL || lblEEPInfo == NULL) { return; } lblStringID->setText(" "); if (awip) { QString buf; buf.sprintf(STATUSBAR_PRINT, GetDevSize(), awip->GetCRC(), awip->IsBufChanged() ? '*' : ' '); lblEEPInfo->setText(buf); lblStringID->setText(awip->GetStringID()); } } /** void e2CmdWindow::SetChipSubType(int pritype, int subtype) { long type = BuildE2PType(pritype, subtype); //11 - indice pulsante all'interno della toolbar //ATTENZIONE! cambia ogni volta che si sposta il gadget! //Look for cbxEEPSubType item index int index = -1; int k; for (k = 0; ToolBar[k].cmdType != C_EndOfList; k++) { if (ToolBar[k].cmdId == cbxEEPSubType) { index = k; break; } } if (index > -1) { ToolBar[index].itemList = (void*) GetEEPSubTypeList(pritype); SetValue(cbxEEPSubType, 0, ChangeListPtr); } int j = GetEEPSubTypeIndex(type); if (j > -1) //-1 significa non trovato { // if (awip && strlen(awip->GetStringID()) > 0) { GetEEPSubTypeList(pritype)[j] = awip->GetStringID(); SetValue(cbxEEPSubType, 0, ChangeList); } // SetValue(cbxEEPSubType, j, Value); } } **/ /** void e2CmdWindow::UpdateChipType(int pritype, int subtype) { if (pritype < 0) pritype = awip->GetEEPPriType(); if (pritype == 0) pritype = E24XX; if (subtype < 0) subtype = awip->GetEEPSubType(); SetValue(cbxEEPType, GetEEPTypeIndex(pritype), Value); SetChipSubType(pritype, subtype); } **/ // #define COMBOLIST_SIZE 128 /** * @brief add in the status bar of three widgets * */ void e2CmdWindow::createStatusWidgets() { // lblEEPInfo = new QLabel(); lblEEPInfo->setFixedWidth(300); // lblEEPInfo->setFixedHeight(17); statusbar->addWidget(lblEEPInfo); QFrame *verticalLine = new QFrame(); verticalLine->setFrameStyle(QFrame::VLine); statusbar->addWidget(verticalLine); // verticalLine->setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Expanding) // EK 2017 // if we need the progress bar in state... // statusProgress = new QProgressBar(); // statusProgress->setFixedWidth(100); // statusProgress->setFixedHeight(17); // statusbar->addWidget(statusProgress); lblStringID = new QLabel(); lblStringID->setFixedWidth(300); // lblStringID->setFixedHeight(17); statusbar->addWidget(lblStringID); } void e2CmdWindow::createToolBarNotice() { txtID = new QLabel(); txtID->setFixedWidth(90); txtID->setFixedHeight(25); toolBarNote->addWidget(txtID); txtComment = new QLabel(); txtComment->setFixedHeight(25); txtComment->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); txtComment->setStyleSheet("border: 1px solid grey"); toolBarNote->addWidget(txtComment); } void e2CmdWindow::createToolBarCbx() { cbxEEPType = new QComboBox(); cbxEEPType->setSizeAdjustPolicy(QComboBox::AdjustToContents); toolBarDevices->addWidget(cbxEEPType); cbxEEPSubType = new QComboBox(); cbxEEPSubType->setSizeAdjustPolicy(QComboBox::AdjustToContents); toolBarDevices->addWidget(cbxEEPSubType); } /** * @brief slot from comboobox pritype * */ void e2CmdWindow::onDevType(int t) { // search id long new_id = 0; if (deviceMenu[t].info.count()) { new_id = deviceMenu[t].info.at(0).id; if (currentAct != NULL) { currentAct->setChecked(false); } } CmdSelectDevice(new_id); } /** * @brief slot from comboobox subtype * */ void e2CmdWindow::onDevSubType(int st) { // search id int t = cbxEEPType->currentIndex(); QString nm = cbxEEPSubType->currentText(); nm = nm.remove("&"); long new_id = 0; for (int i = 0; i < deviceMenu[t].info.count(); i++) { if (deviceMenu[t].info.at(i).name == nm) { new_id = deviceMenu[t].info.at(i).id; } } CmdSelectDevice(new_id); } // not in using #if 0 menuToGroup *e2CmdWindow::searchMenuInDeviceVector(int pre_type) { menuToGroup *pM = NULL; for (int i = 0; i < deviceMenu.count(); i++) { menuToGroup *mTmp = (menuToGroup *)&deviceMenu.at(i); for (int t = 0; t < (*mTmp).pre_type.count(); t++) { if ((*mTmp).pre_type.at(t) == pre_type) { pM = mTmp; return pM; } } } return NULL; } #endif void e2CmdWindow::UpdateMenues(menuToGroup &mnu, QAction &act) { if (currentMenu != &mnu || currentAct != &act) // main menu was changed { Q_CHECK_PTR(cbxEEPType); Q_CHECK_PTR(cbxEEPSubType); if (currentAct != NULL) { currentAct->setChecked(false); } // qDebug() << mnu.title << act.text(); selectTypeSubtype(mnu.title, act.text()); act.setChecked(true); currentAct = &act; } } void e2CmdWindow::UpdateMenuType(long new_type) { if (new_type == 0) { new_type = awip->GetEEPId(); } int new_pritype = GetE2PPriType(new_type); qDebug() << Q_FUNC_INFO << " (hex) type:" << (hex) << new_type << " pri:" << new_pritype << (dec); menuToGroup *newMenu = NULL; QAction *newAct = NULL; foreach (menuToGroup m, deviceMenu) { for (int n = 0; n < m.pre_type.count(); n++) { if (m.pre_type.at(n) != new_pritype) { continue; } for (int j = 0; j < m.info.count(); j++) { if (m.info.at(j).id == new_type) { newMenu = &m; newAct = m.grp->actions().at(j); break; } if (newAct != NULL) { break; } } if (newAct != NULL) { break; } } if (newAct != NULL) { break; } } UpdateMenues(*newMenu, *newAct); // EK 2017 // it's not possible to hide the actions, or? if (new_pritype == PIC125XX) //Not Erasable { actionErase->setDisabled(true); } else { actionErase->setEnabled(true); } if (awip && (awip->GetSplittedInfo() > 0) && (awip->GetSize() > awip->GetSplittedInfo())) { //Enable menus actionReadFlash->setEnabled(true); actionReadEep->setEnabled(true); actionWriteFlash->setEnabled(true); actionWriteEep->setEnabled(true); actionVerifyFlash->setEnabled(true); actionVerifyEep->setEnabled(true); actionOpenFlash->setEnabled(true); actionOpenEep->setEnabled(true); actionSaveFlashAs->setEnabled(true); actionSaveEepAs->setEnabled(true); } else { //Disable menus actionReadFlash->setEnabled(false); actionReadEep->setEnabled(false); actionWriteFlash->setEnabled(false); actionWriteEep->setEnabled(false); actionVerifyFlash->setEnabled(false); actionVerifyEep->setEnabled(false); actionOpenFlash->setEnabled(false); actionOpenEep->setEnabled(false); actionSaveFlashAs->setEnabled(false); actionSaveEepAs->setEnabled(false); } } /** * @brief search the name in vectors * */ long GetEEPTypeFromString(const QString &name) { QString n = name; n = n.remove("&"); foreach (menuToGroup m, deviceMenu) { foreach (chipInfo c, m.info) { if (QString::compare(c.name, n, Qt::CaseInsensitive) == 0) { return c.id; } } } return EID_INVALID; } // EK 2017 // do not search, get directly ;) long e2CmdWindow::CbxIdToType(int idx1, int idx2) { // int k; long rv = -1; if (idx1 < 0 || idx1 >= deviceMenu.count()) { return rv; } if (idx2 < 0 || idx2 >= deviceMenu[idx1].info.count()) { return rv; } rv = deviceMenu.at(idx1).info.at(idx2).id; return rv; } // EK 2017 // TODO for toolBar3: combo boxes void e2CmdWindow::CbxMenuInit() { // create widgets in tool bar 3 createToolBarCbx(); createToolBarNotice(); QStringList lst; //generic foreach (menuToGroup m, deviceMenu) { lst << m.title; } // for (int i = 0; i < deviceMenu.count(); i++) // { // lst << deviceMenu.at(i).mnu->title(); // } if (lst.count()) { cbxEEPType->addItems(lst); cbxEEPType->setCurrentIndex(0); currentMenu = (menuToGroup *)&deviceMenu.at(0); } //UpdateMenuType(); //Clear the check in menu Edit buffer actionEditBuferEnabled->setChecked(E2Profile::GetEditBufferEnabled()); // EditMenu[2].checked = 0; } void e2CmdWindow::UpdateStrFromBuf() { QString s; s = awip->GetStringID(); if (s.length()) { txtID->setText(s); } s = awip->GetComment(); if (s.length()) { txtComment->setText(s); } } void e2CmdWindow::UpdateStrFromStr(const QString &s1, const QString &s2) { if (s1.length()) { txtID->setText(s1); awip->SetStringID(s1); } if (s2.length()) { txtComment->setText(s2); awip->SetComment(s2); } } static QStringList script_filter = QStringList({ "Script Files (*.e2s)", "All Files (*)" }); //static int script_filterIndex = 0; int e2CmdWindow::OpenScript(const QString &file) { QString fileName; int rval = 1; if (file.length() == 0) { if (verbose == verboseNo) { rval = BADPARAM; } else { QString fltr = convertFilterListToString(script_filter); QString open_path(""); QStringList l = E2Profile::GetLastScripts(); if (l.count() > 0) { open_path = QFileInfo(l.at(0)).canonicalPath(); } if (open_path.length() == 0) { open_path = QDir::homePath(); } fileName = QFileDialog::getOpenFileName(this, translate(STR_MSGOPENSCRIPT), open_path, fltr); } } if (fileName.length() > 0) { if (QFile::exists(fileName)) { QString oldname = script_name; script_name = fileName; rval = CmdRunScript(true); if (rval != OK) { script_name = oldname; } } else { if (verbose != verboseNo) { QMessageBox note(QMessageBox::Warning, "Open script", translate(STR_MSGFILENOTFOUND), QMessageBox::Yes); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Yes, translate(STR_YES)); note.exec(); } rval = FILENOTFOUND; } } else { rval = OP_ABORTED; } return rval; } static QStringList filter = QStringList({ "*.e2p", "*.hex", "*.mot", "*.bin", "*.csm", "*" }); // ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ // form E2P form Intel form S-rec, form Binary (Raw), CSM, gli altri non aggiungono ulteriori formati static QStringList filterInfo = QStringList({ "E2P files (*.e2p)", "Intel hex files (*.hex)", "S-rec mot files (*.mot)", "Binary files (*.bin)", "CSM (*.csm)", "No filter (*)" }); static int filterIndex = 0; static void AddExtension(QString &name) { int p = name.lastIndexOf('.'); //look for extension if (p < 0 || (name.mid(p) != filter.at(filterIndex).mid(1))) { //if not found append extension name += filter.at(filterIndex).mid(1); } } static bool CmpExtension(const QString &name, const QString &ext) { if ((name.length() > 0) && (ext.length() > 0)) { int pos = name.lastIndexOf('.'); //look for extension if (pos > 0) { if (ext == name.mid(pos)) { return true; } } } return false; } int e2CmdWindow::OpenFile(const QString &file) { QString fileName; int rval = 1; if (file.length() == 0) { if (verbose == verboseNo) { rval = BADPARAM; } else { filterIndex = (int)awip->GetFileBuf(); // ??? QString open_path = QDir::homePath(); //TODO: load from settings QString fltr = convertFilterListToString(filterInfo); if (awip->GetLoadType() == PROG_TYPE) { fileName = QFileDialog::getOpenFileName(this, translate(STR_MSGOPENPROGFILE), open_path, fltr); } else if (awip->GetLoadType() == DATA_TYPE) { fileName = QFileDialog::getOpenFileName(this, translate(STR_MSGOPENDATAFILE), open_path, fltr); } else { fileName = QFileDialog::getOpenFileName(this, translate(STR_MSGOPENFILE), open_path, fltr); } E2Profile::SetDefaultFileType((FileType)filterIndex); } } else { fileName = file; } if (fileName.length() > 0) { if (QFile::exists(fileName)) { QString oldfname = awip->GetFileName(); awip->SetFileName(fileName); long old_type = awip->GetEEPId(); //EEP type can be changed by E2P file load rval = awip->Load(); if (rval <= 0) { awip->SetFileName(oldfname); //If we go here there is a serious problem!! If file exist awip->Load() should succeded if (verbose != verboseNo) { QMessageBox note(QMessageBox::Critical, "Open file", "Unable to load the file", QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } else { SetTitle(); UpdateStrFromBuf(); //UpdateChipType(); if (awip->GetEEPId() != old_type) { UpdateMenuType(awip->GetEEPId()); } first_line = 0; //curIndex = 0; Draw(); UpdateStatusBar(); rval = OK; } } else { if (verbose != verboseNo) { QMessageBox note(QMessageBox::Critical, "Open file", translate(STR_MSGFILENOTFOUND), QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } rval = FILENOTFOUND; } } return rval; } int e2CmdWindow::filterNameToIndex(const QString &s, const QStringList &lst) { for (int i = 0; i < lst.count(); i++) { if (lst.at(i) == s) { return i; } } return -1; } QString e2CmdWindow::convertFilterListToString(const QStringList &lst) { QString fltr; for (int i = 0; i < lst.count(); i++) { if (i < lst.count() - 1) { fltr += QString(lst.at(i) + ";;"); } else // the last element { fltr += lst.at(i); } } return fltr; } int e2CmdWindow::SaveFile(int force_select) { int err = 0; if (!force_select && awip->GetFileName().length() > 0) { // Name validated //awip->SetNoOfBlock(awip->GetNoOfBank()); if ((err = awip->Save()) <= 0 && verbose != verboseNo) { QString str; str = translate(STR_MSGFILESAVEFAIL) + QString(" (%d)\n").arg(err); QMessageBox note(QMessageBox::Critical, "Save", str, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); } } else if (verbose == verboseNo) { err = BADPARAM; } else { // Invalid name: select and save the file QString s; if (awip->GetSaveType() == PROG_TYPE) { s = translate(STR_MSGFILESAVEPROG); } else if (awip->GetSaveType() == DATA_TYPE) { s = translate(STR_MSGFILESAVEDATA); } else { s = translate(STR_MSGFILESAVEAS); } filterIndex = (int)awip->GetFileBuf(); // ??? QString fltr = convertFilterListToString(filterInfo); QString sFilter = filterInfo.at(filterIndex); //fn = awip->GetFileName(); //should be the filename proposed by the dialog by default QString fn = QFileDialog::getSaveFileName(this, s, QDir::homePath(), fltr, &sFilter); if (fn.length()) { //Save the old name in case some error occurs, so it can restore it QString oldname = awip->GetFileName(); int fidx = filterNameToIndex(sFilter, filterInfo); if (fidx > -1) { filterIndex = fidx; awip->SetFileBuf((enum FileType)filterIndex); //????? Ci vorrebbe un controllo separato dall'estensione sul tipo di file (combobox) } E2Profile::SetDefaultFileType(awip->GetFileBuf()); AddExtension(fn); awip->SetFileName(fn); if ((err = awip->Save()) <= 0) { QString str; str = QString("%1 %2 (%3)\n").arg(translate(STR_MSGFILESAVEFAIL)).arg(fn).arg(err); QMessageBox note(QMessageBox::Information, "Save", str, QMessageBox::Close); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Close, translate(STR_CLOSE)); note.exec(); //restore previous name awip->SetFileName(oldname); } else { //Tutto OK, imposta il nuovo titolo setWindowTitle(fn); } } } //If the Save is ok if (err > 0) { awip->BufChanged(false); UpdateStatusBar(); err = OK; } return err; } void e2CmdWindow::SetTitle() { QString str = QString(APP_NAME " - ") + GetFileName(); setWindowTitle(str); } QString e2CmdWindow::GetFileName() { if (awip->GetFileName().length() > 0) { return awip->GetFileName(); } else { return translate(STR_NONAME); } } void e2CmdWindow::UpdateScriptMenu() { if (!scriptMode) { disconnect(scrListgrp, SIGNAL(triggered(QAction *)), this, SLOT(onSelectScript(QAction *))); scrptsMenu->clear(); // removeAllActions() while (scrListgrp->actions().count()) { scrListgrp->removeAction(scrListgrp->actions().first()); } QStringList sl = E2Profile::GetLastScripts(); foreach (QString entry, sl) { if (entry.length() > 0 && QFile().exists(entry)) { QString fname = entry; fname.replace(QDir().homePath(), "~"); QAction *tmpAction = new QAction(fname, actionScriptList); scrptsMenu->addAction(tmpAction); scrListgrp->addAction(tmpAction); tmpAction->setIconText(fname); } } connect(scrListgrp, SIGNAL(triggered(QAction *)), this, SLOT(onSelectScript(QAction *))); #if 0 if (sp.length() > 0) { script_name = sp; QString str; str = translate(STR_RUNSCR) + " "; int flen = script_name.length(); str += script_name; actionRunScript->setText(str); actionRunScript->setEnabled(true); } #endif } } void e2CmdWindow::UpdateFileMenu() { //Remove any previous menu and create it again with updated list disconnect(fileListgrp, SIGNAL(triggered(QAction *)), this, SLOT(onSelectFile(QAction *))); filesMenu->clear(); // removeAllActions() while (fileListgrp->actions().count()) { fileListgrp->removeAction(fileListgrp->actions().first()); } QStringList lflist = E2Profile::GetLastFiles(); foreach (QString entry, lflist) { if (entry.length() > 0) { int pos_and = entry.lastIndexOf("?"); QString fname; QString stype; if (pos_and > 0) { fname = entry.left(pos_and); stype = entry.mid(pos_and + 1); } else { fname = entry; stype = ""; } if (QFile().exists(fname)) { QString e = fname.replace(QDir().homePath(), "~"); //e += "[" + stype + "]"; QAction *tmpAction = new QAction(e, actionFileList); filesMenu->addAction(tmpAction); fileListgrp->addAction(tmpAction); tmpAction->setIconText(e); //make sure icontext is equal to text if (stype == "PROG") { tmpAction->setIcon(actionOpenFlash->icon()); } else if (stype == "DATA") { tmpAction->setIcon(actionOpenEep->icon()); } else { tmpAction->setIcon(actionOpen->icon()); } } } } connect(fileListgrp, SIGNAL(triggered(QAction *)), this, SLOT(onSelectFile(QAction *))); #if 0 int data_type; sp = E2Profile::GetLastFile(data_type); if (sp.length() > 0) { QString str; int p = sp.lastIndexOf('\\'); if (p >= 0) { str = sp.mid(p + 1, 6); } else { str = sp; // TODO to check this } if (data_type == DATA_TYPE) { str += " DATA"; } else if (data_type == PROG_TYPE) { str += " PROG"; } // actionFile1->setEnabled(true); // actionFile1->setText(str); lastFiles.insert(0, str); } // else // { // actionFile1->setText(""); // actionFile1->setEnabled(false); // } sp = E2Profile::GetPrevFile(data_type); if (sp.length()) { QString str; int p = sp.lastIndexOf('\\'); if (p >= 0) { str = sp.mid(p + 1, 6); } else { str = sp; // TODO to check this } if (data_type == DATA_TYPE) { str += " DATA"; } else if (data_type == PROG_TYPE) { str += " PROG"; } actionFile2->setText(str); actionFile2->setEnabled(true); } else { actionFile2->setText(""); actionFile2->setEnabled(false); } #endif } //Update the buffer with edit changes void e2CmdWindow::UpdateBuffer() { bool flag1 = false, flag2 = false; if (e2HexEdit->isModified()) { const char *ptr = e2HexEdit->data().constData(); memcpy(awip->GetBufPtr(), ptr, e2HexEdit->data().length()); //memcpy(awip->GetBufPtr(), ptr, awip->GetSize()); flag1 = true; } if (e2HexEditSplit->isModified()) { Q_ASSERT(awip->GetSplittedInfo() > 0); const char *ptr = e2HexEditSplit->data().constData(); long ofst = awip->GetSplittedInfo(); memcpy(awip->GetBufPtr() + ofst, ptr, e2HexEditSplit->data().length()); flag1 = true; } if (flag1 || flag2) { awip->BufChanged(); Draw(); } } void e2CmdWindow::Draw() { if (awip == 0 || !awip->IsBufferValid()) { return; // ** Vlib 1.22 call Draw before the AppWinInfo is created ** 28/08/99 } if (awip->GetSplittedInfo() > 0) { e2HexEdit->setHexFontColor(Qt::darkGreen); qbuf->setData(reinterpret_cast(awip->GetBufPtr()), awip->GetSplittedInfo()); e2HexEdit->setData(*qbuf); qDebug() << Q_FUNC_INFO << "Datalen: " << e2HexEdit->data().length() << " Splitted: " << awip->GetSplittedInfo() << " Size: " << awip->GetSize(); char *ptr = reinterpret_cast(awip->GetBufPtr()); long ofst = awip->GetSplittedInfo(); long len = awip->GetSize() - ofst; ptr += ofst; qbufSplit->setData(ptr, len); e2HexEditSplit->setData(*qbufSplit); e2HexEditSplit->show(); qDebug() << Q_FUNC_INFO << "Datalen: " << e2HexEditSplit->data().length() << " Offset: " << ofst << " Len: " << len; } else { e2HexEdit->setHexFontColor(Qt::darkBlue); qbuf->setData(reinterpret_cast(awip->GetBufPtr()), awip->GetSize()); e2HexEdit->setData(*qbuf); e2HexEditSplit->hide(); } #if 0 int no_line; int new_top, new_shown; int k; long size = awip->GetSize();// ? awip->GetSize() : awip->GetBufSize(); long splitted_size = awip->GetSplittedInfo() / awip->GetHexPerLine(); no_line = (size + awip->GetHexPerLine() - 1) / awip->GetHexPerLine(); if (!rows) { rows = e2Canvas->GetRows(); } rows--; // to avoid the scrolling //Caso in cui non c'e` file o tutto il file sta nella finestra if (no_line == 0 || rows >= no_line) { first_line = 0; e2Canvas->ShowVScroll(0); // Hide Vert Scroll } else { //Caso in cui si ingrandisce una finestra che contiene un file // visualizzato in fondo if (rows > no_line - first_line) { first_line = no_line - rows; if (first_line < 0) { first_line = 0; } } // rows : no_line = shown : 100 new_shown = rows * 100 / no_line; // first_line : no_line-rows = top : 100 new_top = first_line * 100 / (no_line - rows); e2Canvas->SetVScroll(new_shown, new_top); e2Canvas->ShowVScroll(1); // Show Vert Scroll } // e2Canvas->Clear(); e2Canvas->GotoRC(0, 0); for (k = first_line; k < first_line + rows && k < no_line; k++) { #ifdef _NO_COLOR e2Canvas->DrawText(awip->Dump(k)); #else e2Canvas->DrawAttrText(awip->Dump(k, 1), ChRed + ChDimColor); if (k >= splitted_size) { e2Canvas->DrawAttrText(awip->Dump(k, 2), ChBlue + ChDimColor); } else { e2Canvas->DrawAttrText(awip->Dump(k, 2), ChGreen + ChDimColor); } e2Canvas->DrawAttrText(awip->Dump(k, 3), ChMagenta + ChDimColor); #endif } e2Canvas->ClearToEnd(k - first_line, 0); int r = -1, c = -1; if (editbuf_enabled) { IndexToCoord(curIndex, r, c); } if (r > -1 && c > -1) { e2Canvas->GotoRC(r, c); e2Canvas->ShowTextCursor(); } else { e2Canvas->HideTextCursor(); } #endif } void e2CmdWindow::PostInit() { // TODO use QFont // QFont font90(vfDefaultFixed); // e2HexEdit->SetFont(font90); UpdateStrFromBuf(); SetTitle(); UpdateFileMenu(); UpdateScriptMenu(); CmdSelectDevice(E2Profile::GetLastDevType(), true); if (E2Profile::GetBogoMips() == 0) { QMessageBox note(QMessageBox::Information, "Calibration", translate(STR_MSGNEEDCALIB), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } if (E2Profile::GetPortNumber() < 0) { QMessageBox note(QMessageBox::Information, "Setup", translate(STR_MSGNEEDSETUP), QMessageBox::Ok); note.setStyleSheet(programStyleSheet); note.setButtonText(QMessageBox::Ok, translate(STR_CLOSE)); note.exec(); } } // EK 2017 // TODO to check this // TODO QPainter convert to QTextDocument ?? void e2CmdWindow::Print() { int no_line = (awip->GetSize() + awip->GetHexPerLine() - 1) / awip->GetHexPerLine(); // int k; // int a, b, cHeight; int curRow = 0, curPage = 0; QPrinter printer(QPrinter::PrinterResolution); QPrintDialog printDialog(&printer, this); E2Profile::GetPrinterSettings(printer); if (printDialog.exec() == QDialog::Accepted) { E2Profile::SetPrinterSettings(printer); QString str; QString title = QString(APP_NAME " by " APP_AUTHOR " ") + translate(STR_MSGPAGE) + " " + QString::number(++curPage); int k = 0; while (k < no_line) { curRow = 0; QStringList t; t << QString("File: " + GetFileName()); t << QString("Device: " + awip->GetStringID()); t << QString("Note: " + awip->GetComment()); t << QString().sprintf("Size : %ld Bytes CRC: %04X", GetDevSize(), awip->GetCRC()); for (; k < no_line && curRow < 66; k++) { t << awip->Dump(k); } curRow++; curPage++; QString body = t.join("
"); str = "
" "
" "" + title + "
" + body + "



"; QTextDocument doc; doc.documentLayout()->setPaintDevice(&printer); doc.setPageSize(printer.pageRect().size()); // This is necessary if you want to hide the page number doc.setHtml(str); doc.print(&printer); } } } bool e2CmdWindow::GetAbortFlag() { qApp->processEvents(); if (e2Prg && e2Prg->wasCanceled()) { abortFlag = true; } bool a = abortFlag; abortFlag = false; return a; } bool e2CmdWindow::GetIgnoreFlag() { return ignoreFlag; } void e2CmdWindow::SetIgnoreFlag() { ignoreFlag = true; } void e2CmdWindow::ClearIgnoreFlag() { ignoreFlag = false; } //Update the progress bar void e2CmdWindow::SetProgress(int progress) { // EK 2017 // TODO //SendWindowCommandAll(pbrProgress, progress, C_Button); // The horizontal bar if (e2Prg) { e2Prg->setValue(progress); } } //void e2CmdWindow::DropFile(const char *fn) //{ // if ( fn && strlen(fn) ) // { // NewAppWin(0, (char*)fn, DefaultWidth(), DefaultHeight(), 0); // } //} void e2CmdWindow::SetAppBusy() { qDebug() << Q_FUNC_INFO; app_status = AppBusy; // EK 2017 // TODO //SendWindowCommandAll(idEnableToolBar, 0, C_Button); } void e2CmdWindow::SetAppReady() { qDebug() << Q_FUNC_INFO; app_status = AppReady; // EK 2017 // TODO //SendWindowCommandAll(idEnableToolBar, 1, C_Button); } void e2CmdWindow::Exit() { qDebug() << Q_FUNC_INFO; if (!IsAppReady()) { SetAbortFlag(); //SendWindowCommandAll(idCloseAllDialog, 0, C_Button); //CheckEvents(); SetAppReady(); } if (IsAppReady()) { if (!scriptMode) { if (IsBufChanged()) { QMessageBox msgBox(QMessageBox::Warning, "PonyProg", translate(STR_MSGCLOSEWINSAVE), QMessageBox::Yes | QMessageBox::No); msgBox.setStyleSheet(programStyleSheet); msgBox.setButtonText(QMessageBox::Yes, translate(STR_YES)); msgBox.setButtonText(QMessageBox::No, translate(STR_NO)); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { CmdSave(); } } E2Profile::saveSplitter(splitter); E2Profile::writeDialogSettings(this, false); E2Profile::sync(); } } } void e2CmdWindow::on_actionPreferences_triggered() { if (IsAppReady()) { PrefDialog prefDlg(this, translate(STR_PREFERENCES)); prefDlg.exec(); } } tmp9balx013/SrcPony/dt006interf.h0000644000175000017500000000505013616566001016541 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _DT006INTERFACE_H #define _DT006INTERFACE_H #include "lpt_ext_interf.h" class Dt006Interface : public LptExtInterface { public: Dt006Interface(bool use_io = false); virtual int Open(int port_no); virtual void Close(); virtual void SetDataOut(int sda = 1); virtual void SetClock(int scl = 1); virtual int GetDataIn(); virtual int GetClock(); virtual void SetClockData(); virtual void ClearClockData(); virtual int IsClockDataUP(); virtual int IsClockDataDOWN(); virtual int TestPort(int port); int SetPower(bool onoff); void SetControlLine(int res = 1); protected: private: // int GetPresence(); }; #endif tmp9balx013/SrcPony/version-qmake.h.in0000644000175000017500000000065013616566001017663 0ustar carstencarsten#ifndef PONYPROGVERSION_H #define PONYPROGVERSION_H #ifndef APP_VERSION #define APP_VERSION \"$$APP_VERSION\" #endif #ifndef APP_AUTHOR #define APP_AUTHOR \"$$APP_AUTHOR\" #endif #ifndef PROGRAM_DATE #define PROGRAM_DATE \"$$APP_BUILD_DATE\" #endif #ifndef APP_NAME #define APP_NAME \"$$APP_NAME\" #endif #ifndef APP_EMAIL #define APP_EMAIL \"$$APP_EMAIL\" #endif #define USE_QT_VERSION $$USE_QT_VERSION #endif tmp9balx013/SrcPony/at93cbus.cpp0000644000175000017500000001356613616566001016477 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at93cbus.h" #include "errcode.h" #include #include #include "e2cmdw.h" //Siamo sicuri BIGENDIAN?? Il formato HexIntel e` little-endian // e quindi anche le AT90S1200 #define _BIG_ENDIAN_ // Costruttore At93cBus::At93cBus(BusInterface *ptr) : MicroWireBus(ptr), ReadCode(06), WriteCode(05), WriteEnableCode(04), EraseAllCode(04), PrClearCode(07), loop_timeout(8000), address_len(6), //9346 organization(ORG16) { qDebug() << Q_FUNC_INFO; } int At93cBus::Erase(int type) { (void)type; clearCS(); setCS(); SendCmdOpcode(WriteEnableCode); SendDataWord(0xFFFF, address_len); clearCS(); setCS(); SendCmdOpcode(EraseAllCode); SendDataWord((2 << (address_len - 2)), address_len); clearCS(); setCS(); SendCmdOpcode(WriteEnableCode); SendDataWord(0, address_len); return 1; } /**** Protect disable sequence: clearCS(); PRE = 0; setCS(); SendCmdOpcode(WriteEnableCode); //WEN SendDataWord(0xFFFF, address_len); clearCS(); PRE = 1; setCS(); SendCmdOpcode(WriteEnableCode); //PREN SendDataWord(0xFFFF, address_len); clearCS(); PRE = 1; setCS(); SendCmdOpcode(PrClearCode); //PRCLEAR SendDataWord(0xFFFF, address_len); clearCS(); PRE = 0; setCS(); SendCmdOpcode(WriteEnableCode); //WDS SendDataWord(0, address_len); ****/ //ATTENTION!!! 93CXX are read and written a WORD at a time (not BYTE) long At93cBus::Read(int addr, uint8_t *data, long length, int page_size) { (void)page_size; qDebug() << "At93cBus::Read(" << (hex) << addr << ", " << data << ", " << (dec) << length; ReadStart(); long len; if (addr > 0) { address_len = addr; } addr = 0; int inc; if (organization == ORG16) { inc = 2; } else { inc = 1; } //Dal piu` significativo al meno significativo for (len = 0; len < length; len += inc) { //17/08/98 -- now repeat the command every word clearCS(); ShotDelay(); setCS(); ShotDelay(); //Send command opcode SendCmdOpcode(ReadCode); SendAddress(addr++, address_len); uint16_t val = RecDataWord(organization); if (organization == ORG16) { #ifdef _BIG_ENDIAN_ *data++ = (uint8_t)(val >> 8); *data++ = (uint8_t)(val & 0xFF); #else *data++ = (uint8_t)(val & 0xFF); *data++ = (uint8_t)(val >> 8); #endif } else { *data++ = (uint8_t)(val & 0xFF); } if ((len % 4) == 0) { if (ReadProgress(len * 100 / length)) { break; } } } WaitMsec(1); //Flush ReadEnd(); qDebug() << Q_FUNC_INFO << "=" << len; return len; } long At93cBus::Write(int addr, uint8_t const *data, long length, int page_size) { long curaddr; WriteStart(); if (addr > 0) { address_len = addr; } clearCS(); //17/08/98 -- may be it's not needed setCS(); SendCmdOpcode(WriteEnableCode); SendDataWord(0xFFFF, address_len); clearCS(); setCS(); if (organization == ORG16) { length >>= 1; //byte to word counter } for (curaddr = 0; curaddr < length; curaddr++) { uint16_t val; if (organization == ORG16) { #ifdef _BIG_ENDIAN_ val = (uint16_t)(*data++) << 8; val |= (uint16_t)(*data++); #else val = (uint16_t)(*data++); val |= (uint16_t)(*data++) << 8; #endif } else { val = *data++; } //Send command opcode SendCmdOpcode(WriteCode); SendAddress(curaddr, address_len); SendDataWord(val, organization); #if 1 if (WaitReadyAfterWrite(loop_timeout)) { return 0; //- 07/08/99 a number >0 but != length mean "User abort" } #else WaitMsec(10); #endif clearCS(); setCS(); if ((curaddr & 1)) if (WriteProgress(curaddr * 100 / length)) { break; } } SendCmdOpcode(WriteEnableCode); SendDataWord(0, address_len); WaitMsec(1); //Flush WriteEnd(); if (organization == ORG16) { curaddr <<= 1; //word to byte counter } return curaddr; } tmp9balx013/SrcPony/lpt_io_interf.h0000644000175000017500000000513113616566001017331 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _LPTIOINTERFACE_H #define _LPTIOINTERFACE_H #include "types.h" #include "portint.h" class LPTIOInterface : public PortInterface { public: LPTIOInterface(); virtual ~LPTIOInterface(); void Close() { lpt_port = -1; PortInterface::CloseParallel(); } void SetPort(int port_no); int InDataPort(int port_no = -1); int OutDataPort(int val, int port_no = -1); int OutControlPort(int val, int port_no = -1); int OutDataMask(int mask, int val); virtual int OutControlMask(int mask, int val); int GetLastData() const { return last_data; } int GetLastCtrl() const { return last_ctrl; } protected: private: int lpt_port; uint8_t last_ctrl, last_data; }; #endif tmp9balx013/SrcPony/sdebus.h0000644000175000017500000000574113616566001015770 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef _SDE2506BUS_H #define _SDE2506BUS_H #include "busio.h" #include "pgminter.h" class Sde2506Bus : public BusIO { public: Sde2506Bus(BusInterface *ptr = 0); virtual ~Sde2506Bus(); long Read(int addr, uint8_t *data, long length, int page_size = 0); long Write(int addr, uint8_t const *data, long length, int page_size = 0); int Reset(); void SetDelay(); protected: int SendDataWord(int wo, int wlen = 8); int RecDataWord(int wlen = 8); int WaitReadyAfterWrite(long timeout = 5000); int SendControlBit(int opcode) { return SendDataWord(opcode, 1); } int SendAddress(int addr) { return SendDataWord(addr, 7); } void setCE() { busI->SetControlLine(0); } void clearCE() { busI->SetControlLine(1); } private: int SendDataBit(int b); int RecDataBit(); void bitDI(int b) { busI->SetDataOut(b); } void setDI() { busI->SetDataOut(1); } void clearDI() { busI->SetDataOut(0); } void setCLK() { busI->SetClock(1); } void clearCLK() { busI->SetClock(0); } int getDO() const { return busI->GetDataIn(); } }; #endif tmp9balx013/SrcPony/at89sxx.cpp0000644000175000017500000001550013616566001016360 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// // At89sxx Class (Atmel 8051 device class) #include "types.h" #include "at89sxx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include "e2cmdw.h" #include At89sxx::At89sxx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { qDebug() << "At89sxx::At89sxx()"; } int At89sxx::SecurityRead(uint32_t &bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { rv = GetBus()->ReadLockBits(bits, GetAWInfo()->GetEEPId()); } return rv; } int At89sxx::SecurityWrite(uint32_t bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { rv = GetBus()->WriteLockBits(bits, GetAWInfo()->GetEEPId()); } return rv; } int At89sxx::FusesRead(uint32_t &bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { rv = GetBus()->ReadFuseBits(bits, GetAWInfo()->GetEEPId()); } return rv; } int At89sxx::FusesWrite(uint32_t bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { rv = GetBus()->WriteFuseBits(bits, GetAWInfo()->GetEEPId()); } return rv; } int At89sxx::QueryType(long &type) { int rv; int code[3]; code[0] = GetBus()->ReadDeviceCode(0x30); code[1] = GetBus()->ReadDeviceCode(0x31); qDebug() << "At89sxx::ParseID(30) *** " << (hex) << code[0] << " - " << code[1] << (dec); type = 0; if (code[0] == 0x1E && code[1] == 0x72) { type = AT89S8252; rv = OK; } else if (code[0] == 0x1E && code[1] == 0x73) { type = AT89S8253; rv = OK; } else { code[0] = GetBus()->ReadDeviceCode(0x000); code[1] = GetBus()->ReadDeviceCode(0x100); code[2] = GetBus()->ReadDeviceCode(0x200); qDebug() << "At89sxx::ParseID(100) *** " << (hex) << code[0] << " - " << code[1] << " - " << code[2] << (dec); if (code[0] == 0x1E && code[1] == 0x51 && code[2] == 0x06) { type = AT89S51; rv = OK; } else if (code[0] == 0x1E && code[1] == 0x52 && code[2] == 0x06) { type = AT89S52; rv = OK; } else { rv = DEVICE_UNKNOWN; } } return rv; } int At89sxx::Probe(int probe_size) { int rv = OK; qDebug() << "At89sxx::Probe(" << probe_size << ") IN"; if (cmdWin->GetIgnoreFlag()) { rv = GetSize(); } else { switch (GetAWInfo()->GetEEPId()) { case AT89S51: case AT89S52: case AT89S8253: { long type; rv = QueryType(type); int subtype = GetE2PSubType(type); if (rv == OK) { if (GetE2PSubType(GetAWInfo()->GetEEPId()) == subtype) { rv = GetSize(); } else { rv = DEVICE_BADTYPE; } } } break; default: rv = GetSize(); break; } } qDebug() << "At89sxx::Probe() = " << rv << " ** OUT"; return rv; } int At89sxx::Read(int probe, int type) { int rv = Probe(); if (rv > 0) { if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = ReadProg(); } if (rv > 0 && GetSize() > GetSplitted()) //Check for DATA size { if (type & DATA_TYPE) { rv = ReadData(); } } if (rv > 0 && (type & CONFIG_TYPE)) { // read the fuses uint32_t f = 0; if (GetBus()->ReadFuseBits(f, GetAWInfo()->GetEEPId()) == OK) { GetAWInfo()->SetFuseBits(f); } f = 0; if (GetBus()->ReadLockBits(f, GetAWInfo()->GetEEPId()) == OK) { GetAWInfo()->SetLockBits(f); } } } } return rv; } int At89sxx::Write(int probe, int type) { int rv = Probe(); if (rv > 0) { if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = WriteProg(); } if (rv > 0 && GetSize() > GetSplitted()) //check for DATA size { if (type & DATA_TYPE) { rv = WriteData(); } } if (rv > 0 && (type & CONFIG_TYPE)) { //write the fuses uint32_t f = GetAWInfo()->GetFuseBits(); GetBus()->WriteFuseBits(f, GetAWInfo()->GetEEPId()); //write the locks f = GetAWInfo()->GetLockBits(); GetBus()->WriteLockBits(f, GetAWInfo()->GetEEPId()); } } } return rv; } int At89sxx::Verify(int type) { if (GetSize() == 0) { return BADPARAM; } int rval = -1; if (GetSize() >= GetSplitted()) { unsigned char *localbuf = new unsigned char[GetSize()]; int v_data = OK, v_prog = OK, v_config = OK; if (type & PROG_TYPE) { v_prog = VerifyProg(localbuf); } if (type & DATA_TYPE) { v_data = VerifyData(localbuf); } if (type & CONFIG_TYPE) { uint32_t fval, lval; int fret, lret; // read the fuses & locks fret = GetBus()->ReadFuseBits(fval, GetAWInfo()->GetEEPId()); lret = GetBus()->ReadLockBits(lval, GetAWInfo()->GetEEPId()); if ((lret == NOTSUPPORTED || GetAWInfo()->GetLockBits() == lval) && (fret == NOTSUPPORTED || GetAWInfo()->GetFuseBits() == fval)) { v_config = OK; } else { v_config = 1; } } rval = (v_prog == OK && v_data == OK && v_config == OK) ? 1 : 0; delete[] localbuf; } return rval; } tmp9balx013/SrcPony/dt006interf.cpp0000644000175000017500000001273013616566001017077 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "errcode.h" #include "dt006interf.h" #include "e2cmdw.h" #include /* data register (0x378) * bit 0: D0 (pin 2) * bit 1: D1 (pin 3) * bit 2: D2 (pin 4) * bit 3: D3 (pin 5) * bit 4: D4 (pin 6) * bit 5: D5 (pin 7) * bit 6: D6 (pin 8) * bit 7: D7 (pin 9) */ /* control register (0x37A) * bit 0: STROBE (pin 1)- * bit 1: AUTOLF (pin 14)- * bit 2: INIT (pin 16)- * bit 3: SELECTIN (pin 17)- */ /* status register (0x379) * bit 3: ERROR (pin 15) * bit 4: SELECT (pin 13) * bit 5: POUT (pin 12) * bit 6: ACK (pin 10) * bit 7: BUSY (pin 11)- */ //DT-006 card #define WB_DOUT 0 // DATA (pin 2) #define WB_RST 2 // DATA (pin 4) #define WB_SCK 3 // DATA (pin 5) #define RB_DIN 7 // STATUS (pin 11) #define WF_SCK (1 << WB_SCK) #define WF_DOUT (1 << WB_DOUT) #define WF_RST (1 << WB_RST) #define RF_DIN (1 << RB_DIN) Dt006Interface::Dt006Interface(bool use_io) : LptExtInterface(use_io) { //DeInstall(); //old_portno = GetInstalled(); } void Dt006Interface::SetControlLine(int res) { if (IsInstalled()) { if (cmdWin->GetPolarity() & RESETINV) { res = !res; } OutDataMask(WF_RST, res ? 0 : 1); } } int Dt006Interface::SetPower(bool onoff) { //OutDataPort(0); //No action SetControlLine(0); return OK; } int Dt006Interface::Open(int port_no) { int ret_val = OK; qDebug() << "Dt006Interface::Open(port=" << port_no << ") IN *** installed=" << IsInstalled(); if (GetInstalled() != port_no) { if (InDataPort(port_no) < 0) { ret_val = E2ERR_OPENFAILED; } else { Install(port_no); OutDataPort(0); } } qDebug() << "Dt006Interface::Open() = " << ret_val << " *** OUT"; return ret_val; } void Dt006Interface::Close() { qDebug() << "Dt006Interface::Close() IN *** installed=" << IsInstalled(); if (IsInstalled()) { LptExtInterface::Close(); DeInstall(); } qDebug() << "Dt006Interface::Close() OUT *** installed=" << IsInstalled(); } void Dt006Interface::SetDataOut(int sda) { if (IsInstalled()) { if (cmdWin->GetPolarity() & DOUTINV) { sda = !sda; } OutDataMask(WF_DOUT, sda ? 1 : 0); } } void Dt006Interface::SetClock(int scl) { if (IsInstalled()) { if (cmdWin->GetPolarity() & CLOCKINV) { scl = !scl; } OutDataMask(WF_SCK, scl ? 1 : 0); } } void Dt006Interface::SetClockData() { if (IsInstalled()) { int control = cmdWin->GetPolarity(); uint8_t cpreg = GetLastData(); if (control & CLOCKINV) { cpreg &= ~WF_SCK; } else { cpreg |= WF_SCK; } if (control & DOUTINV) { cpreg &= ~WF_DOUT; } else { cpreg |= WF_DOUT; } OutDataPort(cpreg); } } void Dt006Interface::ClearClockData() { if (IsInstalled()) { int control = cmdWin->GetPolarity(); uint8_t cpreg = GetLastData(); if (control & CLOCKINV) { cpreg |= WF_SCK; } else { cpreg &= ~WF_SCK; } if (control & DOUTINV) { cpreg |= WF_DOUT; } else { cpreg &= ~WF_DOUT; } OutDataPort(cpreg); } } int Dt006Interface::GetDataIn() { if (IsInstalled()) { if (cmdWin->GetPolarity() & DININV) { return InDataPort() & RF_DIN; } else { return !(InDataPort() & RF_DIN); } } else { return E2ERR_NOTINSTALLED; } } int Dt006Interface::GetClock() { return 1; } int Dt006Interface::IsClockDataUP() { return GetDataIn(); } int Dt006Interface::IsClockDataDOWN() { return !GetDataIn(); } int Dt006Interface::TestPort(int com_no) { (void)com_no; return OK; } tmp9balx013/SrcPony/at93cxx.cpp0000644000175000017500000000734513616566001016343 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "at93cxx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include #define BANK_SIZE 2 //16 bit organization At93cxx::At93cxx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, BANK_SIZE) { qDebug() << "At93cxx::At93cxx()"; } At93cxx::~At93cxx() { qDebug() << "At93cxx::~At93cxx()"; } int At93cxx::Read(int probe, int type) { qDebug() << "At93cxx::Read(" << probe << ")"; GetBus()->SetOrganization(ORG16); if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Read(asize, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } qDebug() << "At93cxx::Read() = " << rv; return rv; } int At93cxx::Write(int probe, int type) { GetBus()->SetOrganization(ORG16); if (probe || GetNoOfBank() == 0) { Probe(); } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); int rv = size; if (type & PROG_TYPE) { rv = GetBus()->Write(asize, GetBufPtr(), size); if (rv != size) { if (rv > 0) { rv = OP_ABORTED; } } } return rv; } int At93cxx::Verify(int type) { GetBus()->SetOrganization(ORG16); if (GetNoOfBank() == 0) { return BADPARAM; } int size = GetNoOfBank() * GetBankSize(); int asize = GetBus()->CalcAddressSize(GetAddrSize()); unsigned char *localbuf = new unsigned char[size]; int rval = 1; if (type & PROG_TYPE) { rval = GetBus()->Read(asize, localbuf, size); if (rval != size) { if (rval > 0) { rval = OP_ABORTED; } } else { rval = (memcmp(GetBufPtr(), localbuf, size) != 0) ? 0 : 1; } } delete[] localbuf; return rval; } tmp9balx013/SrcPony/pic16xx.cpp0000644000175000017500000001241613616566001016335 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "pic16xx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include "e2awinfo.h" #define CONFIG_SIZE ( 8 * sizeof(uint16_t) ) Pic16xx::Pic16xx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { int j; for (j = 0; j < 8; j++) { id_locations[j] = 0xffff; } } Pic16xx::~Pic16xx() { } int Pic16xx::CodeProtectAdjust(uint16_t &config, int read) { if (!read) { //Extend the CP bit (PIC16F84) if (config & (1 << 4)) { config |= 0xfff0; } else { config &= 0x000f; } } config = ~config & 0x3fff; return OK; } int Pic16xx::SecurityRead(uint32_t &bits) { int rv = GetBus()->ReadConfig(id_locations); if (rv == OK) { uint16_t config = id_locations[7]; CodeProtectAdjust(config, 1); bits = config; } return rv; } int Pic16xx::SecurityWrite(uint32_t bits) { uint16_t config = (uint16_t)bits; CodeProtectAdjust(config, 0); int k; for (k = 0; k < 7; k++) { id_locations[k] = 0xffff; } id_locations[7] = config; return GetBus()->WriteConfig(id_locations); } int Pic16xx::Probe(int probe_size) { (void)probe_size; return 1; } int Pic16xx::Read(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if (type & PROG_TYPE) { rv = ReadProg(); } if (rv > 0 && GetSize() > GetSplitted()) //Check for DATA size { if (type & DATA_TYPE) { rv = ReadData(); } } if (rv > 0 && (type & CONFIG_TYPE)) { // read the config locations // this must be the LAST operation (to exit from config mode we have to clear Vpp) uint32_t f; SecurityRead(f); // GetAWInfo()->SetFuseBits(f0); GetAWInfo()->SetLockBits(f); } } return rv; } int Pic16xx::Write(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if ((type & PROG_TYPE) && (type & DATA_TYPE)) { GetBus()->Erase(ALL_TYPE); } else { GetBus()->Erase(type); } if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = WriteProg(); } if (rv > 0 && GetSize() > GetSplitted()) //check for DATA size { if (type & DATA_TYPE) { rv = WriteData(); } } if (rv > 0 && (type & CONFIG_TYPE)) { // write the config locations // this must be the LAST operation (to exit from config mode we have to clear Vpp) uint32_t f; f = GetAWInfo()->GetLockBits(); SecurityWrite(f); } } } else if (rv == 0) { rv = E2ERR_WRITEFAILED; } return rv; } int Pic16xx::Verify(int type) { GetBus()->Reset(); if (GetNoOfBank() == 0) { return BADPARAM; } int rval = -1; if (GetSize() >= GetSplitted()) { unsigned char *localbuf = new unsigned char[GetSize()]; int v_data = OK, v_prog = OK, v_config = OK; if (type & PROG_TYPE) { v_prog = VerifyProg(localbuf); } if (type & DATA_TYPE) { v_data = VerifyData(localbuf); } if (type & CONFIG_TYPE) { uint32_t f; SecurityRead(f); if (GetAWInfo()->GetLockBits() == f) { v_config = OK; } else { v_config = 1; } } rval = (v_prog == OK && v_data == OK && v_config == OK) ? 1 : 0; delete[] localbuf; } return rval; } int Pic16xx::Erase(int probe, int type) { int rv; // rv = Probe( probe || GetNoOfBank() == 0 ); // if (rv > 0) // { rv = GetBus()->Erase(type); // } return rv == OK ? 1 : rv; } tmp9balx013/SrcPony/at90sxx.cpp0000644000175000017500000003174113616566001016355 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include "types.h" #include "globals.h" #include "at90sxx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include #include "e2awinfo.h" #include "e2cmdw.h" At90sxx::At90sxx(e2AppWinInfo *wininfo, BusIO *busp) : Device(wininfo, busp, 1 /*BANK_SIZE*/) { qDebug() << "At90sxx::At90sxx()"; } At90sxx::~At90sxx() { qDebug() << "At90sxx::~At90sxx()"; } int At90sxx::SecurityRead(uint32_t &bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { bits = GetBus()->ReadLockBits(GetAWInfo()->GetEEPId()); rv = OK; } return rv; } int At90sxx::SecurityWrite(uint32_t bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) //Try to write even with AutoXXX device setted { rv = GetBus()->WriteLockBits(bits, GetAWInfo()->GetEEPId()); } return rv; } int At90sxx::FusesRead(uint32_t &bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { bits = GetBus()->ReadFuseBits(GetAWInfo()->GetEEPId()); rv = OK; } return rv; } int At90sxx::FusesWrite(uint32_t bits) { int rv = Probe(); //No size probe needed, just probe for presence if (rv > 0) { rv = GetBus()->WriteFuseBits(bits, GetAWInfo()->GetEEPId()); } return rv; } /** * code[0]: Vendor Code * 0x1E (manufactured by Atmel) * code[1]: Part Family and Flash Size * 0x90 AVR with 1K flash * 0x91 AVR with 2K flash * 0x92 AVR with 4K flash * 0x93 AVR with 8K flash * 0x94 AVR with 16K flash * 0x95 AVR with 32K flash * 0x96 AVR with 64K flash * 0x97 AVR with 128K flash * code[2]: Part Number * * Part number identification table * [ 1 ] [ 2 ] * 0x90 0x01 AT90S1200 (1K + 64) * 0x91 0x01 AT90S2313 (2K + 128) * 0x92 0x01 AT90S4414 (4K + 256) * 0x93 0x01 AT90S8515 (8K + 512) * * 0x06 0x01 ATmega603 (64K + 2K) first few pieces * 0x01 0x01 ATmega103 (128K + 4K) first few pieces * 0x96 0x01 ATmega603 (64K + 2K) * 0x97 0x01 ATmega103 (128K + 4K) * * 0x91 0x02 AT90S2323 (2K + 128) * 0x91 0x03 AT90S2343 (2K + 128) * * 0x92 0x03 AT90S4434 (4K + 256) * 0x93 0x03 AT90S8535 (8K + 512) * * 0x91 0x05 AT90S2333 (2K + 128) * 0x92 0x02 AT90S4433 (4K + 256) * * 0x93 0x04 AT90C8534 (8K + 512) * * 0x93 0x07 ATmega8 (8K + 512) * 0x94 0x03 ATmega16 (16K + 512) * * 0x94 0x01 ATmega161 (16K + 512) * 0x94 0x02 ATmega163 (16K + 512) * * 0x95 0x01 ATmega323 (32K + 1K) * 0x97 0x02 ATmega128 (128K + 4K) * 0x96 0x02 ATmega64 (64K + 2K) * * 0x90 0x03 ATtiny10 (1K) * 0x90 0x04 ATtiny11 (1K) * 0x90 0x05 ATtiny12 (1K + 64) * 0x90 0x06 ATtiny15 (1K + 64) * * 0x91 0x06 ATtiny22 (2K + 128) * 0x91 0x07 ATtiny28 (2K) **/ typedef struct { int code1; int code2; int type; } IdType; static IdType IdArray[] = { {0x90, 0x01, AT90S1200}, {0x91, 0x01, AT90S2313}, {0x92, 0x01, AT90S4414}, {0x93, 0x01, AT90S8515}, {0x96, 0x01, ATmega603}, {0x97, 0x01, ATmega103}, {0x06, 0x01, ATmega603}, {0x01, 0x01, ATmega103}, {0x91, 0x02, AT90S2323}, {0x91, 0x03, AT90S2343}, {0x92, 0x02, AT90S4434}, {0x93, 0x03, AT90S8535}, {0x91, 0x05, AT90S2333}, {0x92, 0x03, AT90S4433}, {0x93, 0x04, AT90S8534}, {0x93, 0x07, ATmega8}, {0x93, 0x06, ATmega8515}, {0x93, 0x08, ATmega8535}, {0x94, 0x01, ATmega161}, {0x94, 0x02, ATmega163}, {0x94, 0x03, ATmega16}, {0x94, 0x04, ATmega162}, {0x94, 0x05, ATmega169}, {0x95, 0x01, ATmega323}, {0x95, 0x02, ATmega32}, {0x97, 0x02, ATmega128}, {0x96, 0x02, ATmega64}, {0x90, 0x03, ATtiny10}, //only HV prog {0x90, 0x04, ATtiny11}, //only HV prog {0x90, 0x05, ATtiny12}, {0x90, 0x07, ATtiny13}, //new (Paul 2005/03/24) {0x90, 0x06, ATtiny15}, {0x91, 0x06, ATtiny22}, {0x91, 0x09, ATtiny26}, {0x91, 0x07, ATtiny28}, //only HV parallel prog {0x91, 0x0A, ATtiny2313}, {0x92, 0x0D, ATtiny4313}, // new 16.09.2015 @RG {0x91, 0x0B, ATtiny24}, // new 08.01.2015 @RG {0x92, 0x07, ATtiny44}, // new 08.01.2015 @RG {0x93, 0x0C, ATtiny84}, // new 08.01.2015 @RG {0x91, 0x08, ATtiny25}, {0x92, 0x06, ATtiny45}, {0x93, 0x0B, ATtiny85}, {0x91, 0x0C, ATtiny261}, {0x92, 0x08, ATtiny461}, {0x93, 0x0D, ATtiny861}, {0x92, 0x05, ATmega48}, // ATmega48A {0x92, 0x0A, ATmega48}, // ATmega48PA {0x93, 0x0A, ATmega88}, // ATmega88A {0x93, 0x0F, ATmega88}, // ATmega88PA {0x94, 0x06, ATmega168}, // ATmega168A {0x94, 0x0B, ATmega168}, // ATmega168PA {0x95, 0x14, ATmega328}, // ATmega328 {0x95, 0x0F, ATmega328}, // ATmega328P {0x94, 0x0A, ATmega164}, {0x94, 0x0F, ATmega164}, // new ATmega164A (RG 30.08.2013) {0x95, 0x08, ATmega324}, {0x95, 0x15, ATmega324}, // new ATmega324A (RG 30.08.2013) {0x95, 0x11, ATmega324}, // new ATmega324PA (RG 30.08.2013) {0x96, 0x09, ATmega644}, {0x96, 0x0A, ATmega644}, // new ATmega644PA (RG 18.04.2012) {0x95, 0x81, AT90CAN32}, {0x96, 0x81, AT90CAN64}, {0x97, 0x81, AT90CAN128}, {0x96, 0x08, ATmega640}, {0x97, 0x03, ATmega1280}, {0x97, 0x04, ATmega1281}, {0x97, 0x05, ATmega1284}, // new ATmega1284P (RG 10.06.2017) {0x98, 0x01, ATmega2560}, {0x98, 0x02, ATmega2561}, // {0x51, 0x06, AT89551}, // {0x52, 0x06, AT89552}, // {0x91, 0x81, AT86RF401}, {0x00, 0x00, AT90S0000} }; int At90sxx::QueryType(long &type) { int rv; int code[3]; code[0] = GetBus()->ReadDeviceCode(0); code[1] = GetBus()->ReadDeviceCode(1); code[2] = GetBus()->ReadDeviceCode(2); qDebug() << "At90sxx::ParseID() *** " << (hex) << code[0] << " - " << code[1] << " - " << code[2] << (dec); detected_type = type = 0; detected_signature = ""; // if (code[0] == 0x00 && code[1] == 0x01 && code[2] == 0x02) { //device is locked rv = DEVICE_LOCKED; } else if (code[0] == 0x1E) { int k; for (k = 0; IdArray[k].code1 != 0x00; k++) { if (IdArray[k].code1 == code[1] && IdArray[k].code2 == code[2]) { type = IdArray[k].type; break; } } if (type) { detected_type = type; } detected_signature.sprintf("%02X-%02X-%02X", code[0], code[1], code[2]); //snprintf(detected_signature, MAXMSG, "%02X-%02X-%02X", code[0], code[1], code[2]); rv = type ? OK : DEVICE_UNKNOWN; } else { //Preproduction device or device missing rv = DEVICE_UNKNOWN; } return rv; } // Probe() can change the bus according to the device detected. // Note that the Verify() operation don't call probe() before // to read the device, so it use the current bus. In the case // of AutoXXX selected the bus setted is the AT1200S. // So it works because of the Read routine is the same just for // AT1200Bus, AT90SXXBus and ATmegaBus. // Detect the size of the device. Note that if the // device is locked, the probe don't work and returns the // error DEVICE_LOCKED. // If the device is missing return 0. int At90sxx::Probe(int probe_size) { int rv; qDebug() << "At90sxx::Probe(" << probe_size << ") IN"; if (cmdWin->GetIgnoreFlag()) { rv = GetSize(); } else { long type; rv = QueryType(type); int subtype = GetE2PSubType(type); if (rv == OK) { if (GetE2PSubType(GetAWInfo()->GetEEPId()) == subtype) { rv = GetSize(); } else { rv = DEVICE_BADTYPE; } } } qDebug() << "At90sxx::Probe() = " << rv << " ** OUT"; return rv; } int At90sxx::Erase(int probe, int type) { int rv = OK; if ((type & PROG_TYPE) && (type & DATA_TYPE)) { GetBus()->Erase(); rv = Probe(probe || GetNoOfBank() == 0); } else { rv = NOTSUPPORTED; } return rv; } int At90sxx::Read(int probe, int type) { int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = ReadProg(); } if (rv > 0 && GetSize() > GetSplitted()) //Check for DATA size { if (type & DATA_TYPE) { rv = ReadData(); } } if (rv > 0) { if (type & CONFIG_TYPE) { // read the fuses uint32_t f = GetBus()->ReadFuseBits(GetAWInfo()->GetEEPId()); GetAWInfo()->SetFuseBits(f); f = GetBus()->ReadLockBits(GetAWInfo()->GetEEPId()); GetAWInfo()->SetLockBits(f); } } } } return rv; } int At90sxx::Write(int probe, int type) { // if ( (type & PROG_TYPE) && (type & DATA_TYPE) ) if ((type & PROG_TYPE)) //Because to write the flash we must erase ALL the device (a msg may alert that doing so the DATA may be erased too) { GetBus()->Erase(); } int rv = Probe(probe || GetNoOfBank() == 0); if (rv > 0) { if (GetSize() >= GetSplitted()) { if (type & PROG_TYPE) { rv = WriteProg(); } if (rv > 0 && GetSize() > GetSplitted()) //check for DATA size { if (type & DATA_TYPE) { rv = WriteData(); } } if (rv > 0) { if (type & CONFIG_TYPE) { if (GetAWInfo()->GetEEPId() == AT90S4433 || GetAWInfo()->GetEEPId() == AT90S2333) { //write the locks uint32_t f = GetAWInfo()->GetLockBits(); GetBus()->WriteLockBits(f, GetAWInfo()->GetEEPId()); GetBus()->WaitMsec(100); //write the fuses f = GetAWInfo()->GetFuseBits(); GetBus()->WriteFuseBits(f, GetAWInfo()->GetEEPId()); } else { //write the fuses uint32_t f = GetAWInfo()->GetFuseBits(); GetBus()->WriteFuseBits(f, GetAWInfo()->GetEEPId()); //write the locks f = GetAWInfo()->GetLockBits(); GetBus()->WriteLockBits(f, GetAWInfo()->GetEEPId()); } } } } } return rv; } int At90sxx::Verify(int type) { if (GetSize() == 0) { return BADPARAM; } int rval = -1; if (GetSize() >= GetSplitted()) { unsigned char *localbuf = new unsigned char[GetSize()]; int v_data = OK, v_prog = OK, v_config = OK; if (type & PROG_TYPE) { v_prog = VerifyProg(localbuf); } if (type & DATA_TYPE) { v_data = VerifyData(localbuf); } if (type & CONFIG_TYPE) { // read the fuses & locks uint32_t f = GetBus()->ReadFuseBits(GetAWInfo()->GetEEPId()); uint32_t l = GetBus()->ReadLockBits(GetAWInfo()->GetEEPId()); if (GetAWInfo()->GetLockBits() == l && GetAWInfo()->GetFuseBits() == f) { v_config = OK; } else { v_config = 1; } } rval = (v_prog == OK && v_data == OK && v_config == OK) ? 1 : 0; delete[] localbuf; } return rval; } tmp9balx013/SrcPony/e2cmdw.h0000644000175000017500000002461413616566001015664 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #ifndef e2CMDW_H #define e2CMDW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "device.h" #include "Translator.h" #include "e2app.h" #include "e2awinfo.h" #include "ui_mainwindow.h" #include "qhexedit.h" struct menuToGroup { QMenu *mnu; QString title; QString filter; QActionGroup *grp; // vector of main type QVector pre_type; // copy of chipInfo QVector info; }; typedef enum { verboseNo, verboseErr, verboseAll } VerboseType; class e2App; class e2AppWinInfo; class e2CmdWindow : public QMainWindow, public e2App, public Ui::MainWindow { Q_OBJECT public: e2CmdWindow(QWidget *parent = 0); virtual ~e2CmdWindow(); // virtual int CloseAppWin(); // virtual void WindowCommand(ItemVal id, ItemVal val, CmdType cType); // virtual void KeyIn(vKey keysym, unsigned int shift); void About(); void Print(); // int NextLine(); // int PrevLine(); // void ScrollV(int top); void PostInit(); // void CharEdit(int row = -1, int col = -1); int IsBufChanged() const; void SetTitle(); QString GetFileName(); QProgressDialog *GetProgressDlg() { return e2Prg; } bool GetIgnoreFlag(); void SetIgnoreFlag(); void ClearIgnoreFlag(); bool GetAbortFlag(); void SetAbortFlag(bool a = true) { abortFlag = a; } void SetProgress(int progress = 0); bool IsAppBusy() { return (app_status == AppBusy); } bool IsAppReady() { return (app_status == AppReady); } void SetAppBusy(); void SetAppReady(); long GetCurrentChipType() { if (awip) { return awip->GetEEPId(); } else { return EID_INVALID; } } // virtual void DropFile(const char *fn); //TODO use QDrag for drag&drop file into the buffer virtual void Exit(); QString getStyleSheet() { return programStyleSheet; } private slots: // void onNew(); void onOpen(); // void onSave(); // void onSaveAs(); // void onReload(); // void onPrint(); // void onAboutQt(); void onWrite(); // void onRead(); // void onErase(); // void onVerify(); // //void onRunScript(); void onLoadScript(); // //void onDebugger(); void onReset(); // void onInterfSetup(); // void onGetInfo(); // void onHelp(); // void onAbout(); // void onEditBufToggle(); // void onCalibration(); // void onProgram(); // void onByteSwap(); // void onLastFile1(); // void onLastFile2(); void onDoubleSize(); // void onOverwriteMode(bool b); void onWriteHEndurance(); void onAskToSave(); //void onProgress(int val); //void onCloseAllDialog(); void onSelectEEPType(int val); void onEEPSubType(int val); void onSetSerialNumber(); void onClearBuf(); void onEditNote(); void onReadCalibration(); void onReadSecurity(bool display_dialog); //void onWriteSecurity(); void onFillBuf(); void onSpecialBits(); void onProgramOptions(); // void onSerialNumberOptions(); void onOscCalibOption(); // void onClose(); // void onExit(); // void onDevType(int i); void onDevSubType(int i); // EK 2017: slot for signals from group actions void onSelectChip(QAction *a); //void onEndProgress(); void selectFontSize(QAction *mnu); void setLang(QAction *mnu); //void setOverwriteMode(bool); //void dataChanged(); void onSelectScript(QAction *a); void onSelectFile(QAction *a); void onDtaChanged(); void on_actionPreferences_triggered(); public: int CmdHelp(); protected: //void CmdRemoteMode(); void closeEvent(QCloseEvent *event) override; private: //All commands int CmdOpen(int type = ALL_TYPE, const QString &file = 0, long relocation = 0, int clear_buffer = -1); int CmdSave(int type = ALL_TYPE, const QString &file = 0, long relocation = 0); int CmdSaveAs(int type = ALL_TYPE, long relocation = 0); int CmdLastFile(int index = 0); int CmdReload(); int CmdPrint(); int CmdRead(int type = ALL_TYPE); int CmdWrite(int type = ALL_TYPE, bool verify = true); int CmdVerify(int type = ALL_TYPE); int CmdErase(int type = ALL_TYPE); int CmdGetInfo(); int CmdReset(); int CmdReadLock(); // int CmdWrite(int type); // int CmdRunScript(); int CmdLoadScript(); int CmdWriteLock(); int CmdReadSpecial(); int CmdWriteSpecial(); int CmdReadSecurity(bool display_dialog); int CmdWriteSecurity(); int CmdDoubleSize(); int CmdClearBuf(int type = ALL_TYPE); int CmdFillBuf(); int CmdByteSwap(); int CmdCalibration(); int CmdEditNote(); int CmdSelectDevice(long new_type, bool init = false); int CmdSetDeviceType(int val); // or const QString* ? int CmdSetDeviceSubType(int val); int CmdProgram(); int CmdSetSerialNumber(); int CmdReadCalibration(int idx); int CmdRunScript(bool test_mode = false); int SpecialBits(bool readonly = false); int ProgramOptions(); int SerialNumberOptions(); int OscCalibOption(); void createToolBarNotice(); void createToolBarCbx(); void reateToolBarNotice(); void createStatusWidgets(); //int findItemInMenuVector(const QString &n); void addMenuVector(menuToGroup *vecMnu, const QString &filter = ""); bool readLangDir(); bool getLangTable(); void setLangGUI(); void translateGUI(); void createScriptList(); void createFileList(); private: void createSignalSlotConnections(); QString convertFilterListToString(const QStringList &lst); int filterNameToIndex(const QString &s, const QStringList &lst); void doProgress(const QString &text); void Draw(/*int rows = 0, int cols = 0*/); void UpdateBuffer(); // menuToGroup *searchMenuInDeviceVector(int new_type); void createDeviceMenues(); void addI2C8Struct(); void addI2C16Struct(); void addI2CAT17Struct(); void addMW16Struct(); void addMW8Struct(); void addSPIStruct(); void addAT90Struct(); void addAT89Struct(); void addPIC16Struct(); void addPIC12Struct(); void addIMBUSStruct(); void addSDEStruct(); void addX24CStruct(); int SaveFile(int force_select = 0); int OpenFile(const QString &file = 0); void UpdateStrFromBuf(); void UpdateStrFromStr(const QString &s1, const QString &s2 = 0); void UpdateStatusBar(); // void UpdateChipType(int pritype = -1, int subtype = -1); // void SetChipSubType(int pritype, int subtype = 0); void UpdateMenues(menuToGroup &grp, QAction &act); void UpdateMenuType(long new_type = 0/*, long old_type = 0*/); void UpdateFileMenu(); void UpdateScriptMenu(); // int TypeToMenuId(long type); // long MenuIdToType(QAction * id); // void MenuIdToCbxId(int id, int &idx1, int &idx2); // void TypeToCbxId(long type, int &idx1, int &idx2); void CbxMenuInit(); long CbxIdToType(int idx1, int idx2); int OpenScript(const QString &file); int OnError(int err_no, const QString &msgerr = 0); int PlaySoundMsg(bool val); long GetDevSize() const; void setFontForWidgets(void); void createFontSizeMenu(); // int CoordToIndex(int row, int col); // void IndexToCoord(int index, int &row, int &col); // void setMenuIndexes(); long selectTypeSubtype(const QString &t, const QString &st); int ScriptError(int line_number, int arg_index, const QString &s, const QString msg = ""); private: QString selectedLang; QFont sysFont; short fontSize; QLabel *txtComment; QLabel *txtID; QStringList arguments; QString programStyleSheet; QComboBox *cbxEEPType; QComboBox *cbxEEPSubType; QLabel *lblEEPInfo; QLabel *lblStringID; menuToGroup *currentMenu; QAction *currentAct; QLineEdit *txtEEPInfo; QLineEdit *txtStringID; // QProgressBar *statusProgress; QMenu *scrptsMenu; QMenu *filesMenu; QActionGroup *fileListgrp; QActionGroup *scrListgrp; QAction *actionScriptList; QAction *actionFileList; QVector actLangSelect; QVector actFSizeSelect; QActionGroup *fsizeGroup; QActionGroup *langGroup; QStringList langFiles; // Standard elements QHexEdit *e2HexEdit; // For the canvas QHexEdit *e2HexEditSplit; QBuffer *qbuf; QBuffer *qbufSplit; QSplitter *splitter; QProgressDialog *e2Prg; // Info for the TextCanvas int first_line; // Index for checking type menu // int type_index; // int curIndex; // int exit_ok; bool ignoreFlag; bool abortFlag; //True if we have to abort current op AppStatus app_status; //tell if the App is busy (reading, writing, ...) or can react to user events //Verbose mode VerboseType verbose; }; extern e2CmdWindow *cmdWin; #endif tmp9balx013/SrcPony/e24xx.cpp0000644000175000017500000002455513616566001016014 0ustar carstencarsten//=========================================================================// // // // PonyProg - Serial Device Programmer // // // // Copyright (C) 1997-2020 Claudio Lanconelli // // // // http://ponyprog.sourceforge.net // // // //-------------------------------------------------------------------------// // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License // // as published by the Free Software Foundation; either version2 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // // General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program (see LICENSE); if not, write to the // // Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // // //=========================================================================// #include #include "types.h" #include "e2cmdw.h" #include "e2profil.h" #include "e2awinfo.h" #include "e24xx.h" // Header file #include "errcode.h" #include "eeptypes.h" #include E24xx::E24xx(e2AppWinInfo *wininfo, BusIO *busp, int max_no_of_bank, int def_banksize) : Device(wininfo, busp, def_banksize), max_bank(max_no_of_bank), timeout_loop(200), n_bank(0), sequential_read(1), // lettura di un banco alla volta writepage_size(1) // scrittura di un byte alla volta (no page write) { // qDebug() << "E24xx" << THEAPP; base_addr = E2Profile::GetI2CBaseAddr(); E2Profile::SetI2CBaseAddr(base_addr); /*** //Inizializza il vettori degli indirizzi di default // questo nel caso non venga determinata automaticamente // la dimensione con il Probe() int addr, k; for (addr = base_addr, k = 0; k < max_bank; k++, addr += 2) eeprom_addr[k] = addr; ***/ } E24xx::~E24xx() { } //Determina a quali indirizzi I2C si mappa, e // se probe_size == 1 anche la dimensione (numero di banchi) int E24xx::Probe(int probe_size) { int addr, error, k; uint8_t ch; qDebug() << "E24xx::Probe(" << probe_size << ") - IN"; n_bank = 0; for (addr = base_addr, k = 0; k < max_bank; k++, addr += 2) { if (GetBus()->Read(addr, &ch, 1) != 1) { if ((error = GetBus()->Error()) != IICERR_NOADDRACK) { // GetBus()->Open(E2Profile::GetPort()); return error; } } else { eeprom_addr[n_bank++] = addr; } } if (probe_size) { SetNoOfBank(n_bank); } qDebug() << "E24xx::Probe() = " << n_bank << " - OUT"; return n_bank; } int E24xx::Read(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } GetBus()->ReadStart(); if (type & PROG_TYPE) { int k; // legge il contenuto attuale della EEPROM in memoria // for (k = 0; k < GetNoOfBank(); k++) //modificata in modo che legga sempre tutto l'intero // contenuto del dispositivo indipendentemente dalla // capacita` correntemente selezionata for (k = 0; k < n_bank; k++) { if ((error = bank_in(GetBufPtr() + k * GetBankSize(), k))) { // GetBus()->Open(E2Profile::GetPort()); //ormai obsoleta return error; } if (GetBus()->ReadProgress((k + 1) * 100 / n_bank)) { return OP_ABORTED; } } } GetBus()->ReadEnd(); if (n_bank > 0) { return GetNoOfBank(); } else { return 0; } } int E24xx::Write(int probe, int type) { int error = Probe(probe || GetNoOfBank() == 0); if (error < 0) { return error; } GetBus()->WriteStart(); if (type & PROG_TYPE) { // program the eeprom int k; for (k = 0; k < GetNoOfBank(); k++) { if ((error = bank_out(GetBufPtr() + k * GetBankSize(), k))) { // GetBus()->Open(E2Profile::GetPort()); return error; } if (GetBus()->WriteProgress((k + 1) * 100 / GetNoOfBank())) { return OP_ABORTED; } } } GetBus()->WriteEnd(); return GetNoOfBank(); } int E24xx::Verify(int type) { Probe(); //Moved here from 7 lines above (10/12/99) if (GetNoOfBank() == 0) { return BADPARAM; } unsigned char *localbuf = new unsigned char[GetBankSize()]; GetBus()->ReadStart(); int rval = 1; if (type & PROG_TYPE) { // legge il contenuto attuale della EEPROM in memoria int k; for (k = 0; k < GetNoOfBank(); k++) { int error; if ((error = bank_in(localbuf, k))) { // GetBus()->Open(E2Profile::GetPort()); rval = error; break; } if (memcmp(GetBufPtr() + k * GetBankSize(), localbuf, GetBankSize()) != 0) { rval = 0; break; } if (GetBus()->ReadProgress((k + 1) * 100 / GetNoOfBank())) { rval = OP_ABORTED; break; } } } GetBus()->ReadEnd(); delete[] localbuf; return rval; } #define MAX_BANK_SIZE 256 // questa routine si aspetta che in ingresso i 256 bytes da programmare l'eeprom // siano memorizzati nel iicbuffer nelle locazioni da 1 (non da 0!) a 256 int E24xx::bank_out(uint8_t const *copy_buf, int bank, long size, long idx) { int k, j; uint8_t buffer[MAX_BANK_SIZE + 1]; if (size <= 0) { size = GetBankSize(); } qDebug() << "E24xx::bank_out() = bank " << bank << ", size = " << size << ", idx = " << idx; if (copy_buf == 0 || bank >= GetNoOfBank() || size > MAX_BANK_SIZE) { return BADPARAM; } memcpy(buffer + 1, copy_buf, size); #if 0 for (j = 0; j < size; j++) { buffer[j] = j; if (GetBus()->Write(eeprom_addr[bank], buffer + j, 2) != 2) { return GetBus()->Error(); } for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[bank], buffer, 1) != 1; k--) ; if (k == 0) { return E2P_TIMEOUT; } } #else for (j = 0; j < size; j += writepage_size) { buffer[j] = j; if (GetBus()->Write(eeprom_addr[bank], buffer + j, 1 + writepage_size) != (1 + writepage_size)) { return GetBus()->Error(); } for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[bank], buffer, 1) != 1; k--) { qApp->processEvents(); } if (k == 0) { return E2P_TIMEOUT; } } #endif return OK; } int E24xx::bank_in(uint8_t *copy_buf, int bank, long size, long idx) { uint8_t ch; if (copy_buf == 0) // || bank >= GetNoOfBank()) { return BADPARAM; } if (size <= 0) { size = GetBankSize(); } ch = (uint8_t)idx; if (GetBus()->StartWrite(eeprom_addr[bank], &ch, 1) != 1) { return GetBus()->Error(); } if (sequential_read) { if (GetBus()->Read(eeprom_addr[bank], copy_buf, size) < size) { return GetBus()->Error(); } } else { int k; for (k = 0; k < size; k++) { ch = (uint8_t)(k + idx); if (GetBus()->StartWrite(eeprom_addr[bank], &ch, 1) != 1) { return GetBus()->Error(); } if (GetBus()->Read(eeprom_addr[bank], copy_buf + k, 1) != 1) { return GetBus()->Error(); } } } return OK; } #define CMP_LEN 16 int E24xx::BankRollOverDetect(int force) { int rlv = 0; if (GetNoOfBank() > 1) { uint8_t index; uint8_t buf[CMP_LEN + 1], buf1[CMP_LEN], buf2[CMP_LEN]; #if 0 //Lettura dal primo banco index = 0; if (GetBus()->StartWrite(eeprom_addr[0], &index, 1) != 1) { return GetBus()->Error(); } if (GetBus()->Read(eeprom_addr[0], buf1, CMP_LEN) != CMP_LEN) { return GetBus()->Error(); } //Lettura dal secondo banco index = 0; if (GetBus()->StartWrite(eeprom_addr[1], &index, 1) != 1) { return GetBus()->Error(); } if (GetBus()->Read(eeprom_addr[1], buf2, CMP_LEN) != CMP_LEN) { return GetBus()->Error(); } #else int error; if ((error = bank_in(buf1, 0, CMP_LEN))) { return error; } if ((error = bank_in(buf2, 1, CMP_LEN))) { return error; } #endif //Se i primi due banchi sono differenti e` possibile // determinare il bank-rollover if (memcmp(buf1, buf2, CMP_LEN) != 0) { //lettura iniziando dalla fine del primo banco index = GetBankSize() - 1; #if 0 if (GetBus()->StartWrite(eeprom_addr[0], &index, 1) != 1) { return GetBus()->Error(); } if (GetBus()->Read(eeprom_addr[0], buf, CMP_LEN + 1) != CMP_LEN + 1) { return GetBus()->Error(); } #else if ((error = bank_in(buf, 0, CMP_LEN + 1, GetBankSize() - 1))) { return error; } #endif rlv = (memcmp(buf + 1, buf1, CMP_LEN) == 0) ? 1 : 2; } else if (force) { //i banchi sono uguali: modifichiamo temporaneamente // il primo byte del secondo banco (inversione di bit) buf[1] = ~buf2[0]; //inversione di bit buf[0] = 0; //indice (address byte) if (GetBus()->Write(eeprom_addr[1], buf, 2) != 2) { return GetBus()->Error(); } int k; for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[1], buf, 1) != 1; k--) ; if (k == 0) { return E2P_TIMEOUT; } //Ok, ora procedi all roll-over detect index = GetBankSize() - 1; if (GetBus()->StartWrite(eeprom_addr[0], &index, 1) != 1) { return GetBus()->Error(); } if (GetBus()->Read(eeprom_addr[0], buf, CMP_LEN + 1) != CMP_LEN + 1) { return GetBus()->Error(); } rlv = (memcmp(buf + 1, buf1, CMP_LEN) == 0) ? 1 : 2; //rimetti a posto il contenuto dell'eeprom buf[1] = buf2[0]; //contenuto originale buf[0] = 0; //indice (address byte) if (GetBus()->Write(eeprom_addr[1], buf, 2) != 2) { return GetBus()->Error(); } for (k = timeout_loop; k > 0 && GetBus()->Read(eeprom_addr[1], buf, 1) != 1; k--) ; if (k == 0) { return E2P_TIMEOUT; } } } return rlv; } tmp9balx013/cmake/0000755000175000017500000000000013616566001014006 5ustar carstencarstentmp9balx013/cmake/GenerateDEF.cmake0000644000175000017500000000077313616566001017070 0ustar carstencarstenMACRO(PONYPROG_GENERATE_DEF_FILE TARGET_NAME) IF(MSVC) ADD_DEPENDENCIES(${TARGET_NAME} ponyprog-gendef) GET_TARGET_PROPERTY(gendef_EXE ponyprog-gendef LOCATION) ADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME} PRE_LINK COMMAND ${gendef_EXE} $(IntDir)\\$(InputName).def $(TargetFileName) $(IntDir)\\*.obj) SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES LINK_FLAGS "/DEF:$(IntDir)\\$(InputName).def") ENDIF(MSVC) ENDMACRO(PONYPROG_GENERATE_DEF_FILE) tmp9balx013/cmake/libusb_version.c0000644000175000017500000000215313616566001017200 0ustar carstencarsten// #include #include // #include #include #if WIN32 #include typedef const struct libusb_version * (__stdcall * version_fn)(void); #endif int main(int argc, char *argv[]) { int status = 0; const struct libusb_version *ver; #if WIN32 if (argc > 1) { HINSTANCE dll; version_fn get_version; dll = LoadLibraryA(argv[1]); if (!dll) { fprintf(stderr, "Failed to load %s\n", argv[1]); return -1; } get_version = (version_fn) GetProcAddress(dll, "libusb_get_version"); if (get_version) { ver = get_version(); printf("%u.%u.%u", ver->major, ver->minor, ver->micro); } else { fprintf(stderr, "Failed to get address of libusb_get_version()\n"); status = -1; } FreeLibrary(dll); } else { fprintf(stderr, "Windows usage: %s \n", argv[0]); return -1; } #else ver = libusb_get_version(); printf("%u.%u.%u", ver->major, ver->minor, ver->micro); #endif return status; } tmp9balx013/cmake/SystemConfiguration.cmake0000644000175000017500000000133213616566001021023 0ustar carstencarsten# Compiler configuration IF(WIN32) IF(MSVC) SET(PONYPROG_COMPILER_MSVC TRUE) ELSE(MSVC) SET(PONYPROG_COMPILER_GCC TRUE) ENDIF(MSVC) ELSE(WIN32) SET(PONYPROG_COMPILER_GCC TRUE) ENDIF(WIN32) # Win32 API configuration IF(WIN32) SET(PONYPROG_API_WIN32 TRUE) ENDIF(WIN32) # Darwin API configuration IF(APPLE) SET(PONYPROG_API_DARWIN TRUE) EXECUTE_PROCESS( COMMAND sw_vers -productVersion OUTPUT_VARIABLE PONYPROG_OSX_VERSION ) STRING(REGEX REPLACE "([0-9]*)[.]([0-9]*)[.]([0-9]*).*" "\\1" PONYPROG_OSX_MAJOR_VERSION "${PONYPROG_OSX_VERSION}") STRING(REGEX REPLACE "([0-9]*)[.]([0-9]*)[.]([0-9]*).*" "\\2" PONYPROG_OSX_MINOR_VERSION "${PONYPROG_OSX_VERSION}") ENDIF(APPLE) tmp9balx013/cmake/OutOfSourceBuild.cmake0000644000175000017500000000050213616566001020202 0ustar carstencarsten# Disallow in-source build STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" PONYPROG_IN_SOURCE) IF(PONYPROG_IN_SOURCE) MESSAGE(FATAL_ERROR "Ponyprog requires an out of source build. Please create a separate build directory and run 'cmake path_to_ponyprog [options]' there.") ENDIF(PONYPROG_IN_SOURCE) tmp9balx013/cmake/Dependencies.cmake0000644000175000017500000000357113616566001017404 0ustar carstencarstenSET(PONYPROG_REQUIRED_LIBRARIES) SET(PONYPROG_OPTIONAL_LIBRARY_CONFIGURATIONS) SET(PONYPROG_OPTIONAL_LIBRARIES) MACRO(PONYPROG_CHECK_REQUIRED_DEPENDENCY FOUND LIBRARY URLS DESCRIPTION) LIST(APPEND PONYPROG_REQUIRED_LIBRARIES ${LIBRARY}) IF(NOT ${FOUND}) SET(MESSAGE_TEXT "Couldn't find ${LIBRARY}, which is required to build Ponyprog.") SET(MESSAGE_TEXT "${MESSAGE_TEXT} You can obtain ${LIBRARY} from") SET(DELIMITER "") FOREACH(URL ${URLS}) SET(MESSAGE_TEXT "${MESSAGE_TEXT} ${DELIMITER} ${URL}") SET(DELIMITER "or") ENDFOREACH() SET(MESSAGE_TEXT "${MESSAGE_TEXT}.") SET(MESSAGE_TEXT "${MESSAGE_TEXT} ${DESCRIPTION}") MESSAGE(SEND_ERROR "${MESSAGE_TEXT}") ENDIF(NOT ${FOUND}) ENDMACRO(PONYPROG_CHECK_REQUIRED_DEPENDENCY) MACRO(PONYPROG_CHECK_OPTIONAL_DEPENDENCY CONFIG FOUND LIBRARY) LIST(APPEND PONYPROG_OPTIONAL_LIBRARY_CONFIGURATIONS ${CONFIG}) LIST(APPEND PONYPROG_OPTIONAL_LIBRARIES ${LIBRARY}) IF(${CONFIG}) IF(NOT ${FOUND}) MESSAGE(SEND_ERROR "Couldn't find the ${LIBRARY} library, which is required by ${CONFIG}.") ENDIF(NOT ${FOUND}) ENDIF(${CONFIG}) ENDMACRO(PONYPROG_CHECK_OPTIONAL_DEPENDENCY) MACRO(PONYPROG_CHECK_NGUI_DEPENDENCY CONFIG) IF(${CONFIG} AND NOT PONYPROG_BUILD_NGUI_MODULE) MESSAGE(SEND_ERROR "PONYPROG_BUILD_NGUI_MODULE is required by ${CONFIG}.") ENDIF(${CONFIG} AND NOT PONYPROG_BUILD_NGUI_MODULE) ENDMACRO(PONYPROG_CHECK_NGUI_DEPENDENCY) MACRO(PONYPROG_CONDITIONAL_BUILD BUILD_OPTION BUILD_DIRECTORY) IF(${BUILD_OPTION}) ADD_SUBDIRECTORY(${BUILD_DIRECTORY}) ENDIF(${BUILD_OPTION}) ENDMACRO(PONYPROG_CONDITIONAL_BUILD) MACRO(PONYPROG_ADD_LIBRARY LIBRARY_NAME) ADD_LIBRARY(${LIBRARY_NAME} ${ARGN}) SET_TARGET_PROPERTIES(${LIBRARY_NAME} PROPERTIES VERSION "${PONYPROG_SO_VERSION}") ENDMACRO() tmp9balx013/cmake/FindLibUSB-1.0.cmake0000644000175000017500000001030413616566001017163 0ustar carstencarsten# - try to find libusb-1 library # # Cache Variables: (probably not for direct use in your scripts) # LIBUSB_LIBRARY # LIBUSB_INCLUDE_DIR # # Non-cache variables you should use in your CMakeLists.txt: # LIBUSB_LIBRARIES # LIBUSB_INCLUDE_DIRS # LIBUSB_FOUND - if this is not true, do not attempt to use this library # LIBUSB_VERSION # # Requires these CMake modules: # ProgramFilesGlob # FindPackageHandleStandardArgs (known included with CMake >=2.6.2) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) set(LIBUSB_ROOT_DIR "${LIBUSB_ROOT_DIR}" CACHE PATH "Root directory to search for libusb-1") if(WIN32) include(ProgramFilesGlob) # program_files_fallback_glob(_dirs "LibUSB-Win32") program_files_fallback_glob(_dirs "libusb-1.*") message(STATUS "Found libusb in directory: ${_dirs}" ) # program_files_fallback_glob(_dirs "libusb-win32") # message(STATUS "Found libusb in directory: ${_dirs}" ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) if(MSVC) set(_lib_suffixes lib/msvc_x64 MS64/static) else() set(_lib_suffixes lib/mingw_x64 MinGW64/dll MinGW64/static) endif() else() if(MSVC) set(_lib_suffixes lib/msvc MS32/static) else() #(COMPILER_IS_GNUCXX) set(_lib_suffixes lib/gcc lib/mingw MinGW32/dll MinGW32/static) endif() endif() else() set(_lib_suffixes) find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND) pkg_check_modules(PC_LIBUSB libusb-1.0) endif() endif() find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h PATHS ${PC_LIBUSB_INCLUDE_DIRS} ${PC_LIBUSB_INCLUDEDIR} ${_dirs} HINTS "${LIBUSB_ROOT_DIR}" PATH_SUFFIXES include/libusb-1.0 include libusb-1.0) find_library(LIBUSB_LIBRARY NAMES libusb-1.0 usb-1.0 PATHS ${PC_LIBUSB_LIBRARY_DIRS} ${PC_LIBUSB_LIBDIR} ${_dirs} HINTS "${LIBUSB_ROOT_DIR}" PATH_SUFFIXES ${_lib_suffixes}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Libusb-1.0 DEFAULT_MSG LIBUSB_LIBRARY LIBUSB_INCLUDE_DIR) if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARY) set(LIBUSB_FOUND true) endif() if(LIBUSB_FOUND) set(LIBUSB_LIBRARIES "${LIBUSB_LIBRARY}") set(LIBUSB_INCLUDE_DIRS "${LIBUSB_INCLUDE_DIR}") mark_as_advanced(LIBUSB_ROOT_DIR) endif() if(LIBUSB_FOUND AND NOT CMAKE_CROSSCOMPILING) if(LIBUSB_SKIP_VERSION_CHECK) message(STATUS "Skipping libusb version number check.") unset(LIBUSB_VERSION) else() message(STATUS "Checking libusb version...") if(WIN32) string(REPLACE ".lib" ".dll" LIBUSB_DLL "${LIBUSB_LIBRARIES}") try_run(LIBUSB_VERCHECK_RUN_RESULT LIBUSB_VERCHECK_COMPILED ${CMAKE_HELPERS_BINARY_DIR} ${CMAKE_HELPERS_SOURCE_DIR}/libusb_version.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${LIBUSB_INCLUDE_DIRS}" RUN_OUTPUT_VARIABLE LIBUSB_VERSION ARGS "\"${LIBUSB_DLL}\"" ) else() try_run(LIBUSB_VERCHECK_RUN_RESULT LIBUSB_VERCHECK_COMPILED ${CMAKE_HELPERS_BINARY_DIR} ${CMAKE_HELPERS_SOURCE_DIR}/libusb_version.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${LIBUSB_INCLUDE_DIRS}" "-DLINK_LIBRARIES=${LIBUSB_LIBRARIES}" RUN_OUTPUT_VARIABLE LIBUSB_VERSION ) endif() if (NOT LIBUSB_VERCHECK_COMPILED OR NOT LIBUSB_VERCHECK_RUN_RESULT EQUAL 0 ) message(STATUS "${LIBUSB_VERSION}") set(LIBUSB_VERSION "0.0.0") message(WARNING "\nFailed to compile (compiled=${LIBUSB_VERCHECK_COMPILED}) or run (retval=${LIBUSB_VERCHECK_RUN_RESULT}) libusb version check.\n" "This may occur if libusb is earlier than v1.0.16.\n" "Setting LIBUSB_VERSION to ${LIBUSB_VERSION}.\n") return() endif() endif() endif() # mark_as_advanced(LIBUSB_LIBRARY LIBUSB_INCLUDE_DIR ) tmp9balx013/InpOutLib/0000755000175000017500000000000013616566001014573 5ustar carstencarstentmp9balx013/create_rpm_package.sh0000755000175000017500000000144713616566001017067 0ustar carstencarsten#!/bin/bash CMD=$(type -p cmake) if [ ! -x "$CMD" ]; then # not found exit echo "please install cmake and restart this script" exit 1 fi # CMD=$(type -p rpmbuild) # # if [ ! -x "$CMD" ]; then # # not found exit # echo "please install rpmbuild and restart this script" # exit 1 # fi CPU_NUM=$(nproc --all) echo "cpu cores: $CPU_NUM" DIRECTORY="build-rpm" if [ ! -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists. mkdir "$DIRECTORY" fi # because of removing of all files in directory if [ -d "$DIRECTORY" ]; then cd "$DIRECTORY" rm * -rf cmake -DUSE_DEBUGGER=OFF -DUSE_QT5=ON -DUDEV_INSTALL_DIR="/usr/lib/udev/rules.d" .. make -j$CPU_NUM strip -s ponyprog make package-binary-rpm cd .. mv ./$DIRECTORY/ponyprog*.rpm . fi tmp9balx013/create_deb_package.sh0000755000175000017500000000256013616566001017020 0ustar carstencarsten#!/bin/bash CMD=$(type -p cmake) if [ ! -x "$CMD" ]; then # not found exit echo "please install cmake and restart this script" exit 1 fi # CMD=$(type -p dh) # # if [ ! -x "$CMD" ]; then # # not found exit # echo "please install debhelper and restart this script" # exit 1 # fi CPU_NUM=$(nproc --all) echo "cpu cores: $CPU_NUM" DIRECTORY="build-deb" if [ ! -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists. mkdir "$DIRECTORY" fi # because of removing of all files in directory if [ -d "$DIRECTORY" ]; then cd "$DIRECTORY" rm * -rf cmake -DUSE_DEBUGGER=OFF -DUSE_QT5=ON .. make -j$CPU_NUM strip -s ponyprog make package-binary-deb DEB_PACKAGE_FILE_NAME=$(ls ponyprog*.deb) PROJECT_NAME=$(echo ${DEB_PACKAGE_FILE_NAME%.*}) cd .. mv ./$DIRECTORY/$DEB_PACKAGE_FILE_NAME . # warning! for the strange cmake versions # for example cmake 3.7.2 # now fix the permission errors and md5sums mkdir fix_up_deb dpkg-deb -x $DEB_PACKAGE_FILE_NAME fix_up_deb dpkg-deb --control $DEB_PACKAGE_FILE_NAME fix_up_deb/DEBIAN rm $DEB_PACKAGE_FILE_NAME chmod 0644 fix_up_deb/DEBIAN/md5sums sed -i -e "s/\(\s.*\)${PROJECT_NAME}\// /g" fix_up_deb/DEBIAN/md5sums find -type d -print0 |xargs -0 chmod 755 fakeroot dpkg -b fix_up_deb $DEB_PACKAGE_FILE_NAME rm -rf fix_up_deb fi tmp9balx013/INSTALL0000644000175000017500000000324113616566001013757 0ustar carstencarsten----------------- PREPARE FOR BUILD ----------------- Compiling with Qt5 needs qtbase5-dev, qtmultimedia5-dev, libqt5printsupport5, libqt5multimedia5 Name of packages can be different on distributions. --------------- BUILD for Linux --------------- On linux systems you need the following packages installed to build: cmake, make, g++ and selected Qt packages Other packages needed un ubuntu 18.04: libftdi1-dev libftdipp1-dev libusb-1.0.0-dev To build the executable binary file run the script: # ./create_elf_binary.sh In this shell script you can change followed options in the line: cmake -DUSE_DEBUGGER=ON -DUSE_QT5=ON .. USE_DEBUGGER ON/OFF: the debug information in binary file USE_QT5 ON/OFF: select Qt5 or Qt4 USE_PROFILER ON/OFF: include the information for profiling After compiling the linux binary you can test the executable: # ./ponyprog Or with debugger: # gdb -ex run --args ./ponyprog But for direct communication about TTY be sure, than you have access rights. Your username must be added to the tty group. Same playing for the LPT case. The other possibility tu run the program is 'sudo' tool. To generate the debian installer file (deb) please run the script: # ./create_deb_package.sh Install the package # sudo dpkg -i ./ponyprog*.deb The installation set the capabilities from postinst script: # setcap 'cap_sys_tty_config=+ep' /usr/bin/ponyprog To generate the rpm file run the script : # ./create_rpm_package.sh ----------------------------- BUILD for Windows using mingw ----------------------------- Install QT SDK 5. To build the executable file run the script: # create_exe_binary.bat You will find ponyprog.exe in the build directory. tmp9balx013/ponyprog.pro0000644000175000017500000003136413616566001015334 0ustar carstencarsten#------------------------------------------------- # # Project created by QtCreator 2013-05-10T22:49:41 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport multimedia CONFIG += exceptions_off warn_on TARGET = ponyprog TEMPLATE = app DESTDIR = build OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui RC_ICONS = icons/ponyprog.ico APP_NAME = "PonyProg" APP_LOW_NAME = "ponyprog" APP_LOW_H_NAME = ".ponyprog" APP_AUTHOR = "Claudio Lanconelli" APP_COPYRIGHT = "(C) 1997-2020 $$APP_AUTHOR" APP_VERSION = "3.1.1" # APP_BUILD_DATE = $$_DATE_ APP_LONG_NAME = "$$APP_NAME $$APP_VERSION" APP_EMAIL = "PonyProg2000@gmail.com" APP_URL = "https://github.com/lancos/ponyprog/" APP_URL_ISSUES = "https://github.com/lancos/ponyprog/issues" APP_URL_WIKI = "https://github.com/lancos/ponyprog/wiki" APP_USERAGENT = "PonyProg/$$APP_VERSION (github.com/lancos/ponyprog)" # replace it with yours info for donates # APP_DONATE_URL = "https://goo.gl/YFVJ0j" win32 { APP_BUILD_DATE = $$system(date /t) } else { APP_BUILD_DATE = $$system(date +%d-%m-%Y) } # TODO: please check this win32:INCLUDEPATH += $$PWD/windows win32:DEPENDPATH += $$PWD/windows win64:INCLUDEPATH += $$PWD/windows win64:DEPENDPATH += $$PWD/windows # TODO: please add this for macx # macx # in case of manually installations, not from repositories unix:INCLUDEPATH +=/usr/local/include/ CODECFORTR = UTF-8 CODECFORSRC = UTF-8 exists(.git) { APP_REVISION = $$system(git rev-parse --short HEAD) } isEmpty(APP_REVISION) { APP_REVISION = "" } message(ponyprog: PonyProg version is: \"$$APP_VERSION\") message(ponyprog: Detected Qt version: \"$$QT_VERSION\") message(ponyprog: Build destination directory: \"$$DESTDIR\") message(ponyprog: Prefix directory: \"$$PREFIX\") message(ponyprog: Build revision: \"$$APP_REVISION\") #message(ponyprog: lrelease executable name: \"$$LRELEASE_EXECUTABLE\") # to add automatically in the source code VERSION = $$APP_VERSION versionconfig.input = SrcPony/version-qmake.h.in versionconfig.output = $$PWD/SrcPony/version.h QMAKE_SUBSTITUTES += versionconfig # VERSION_FILE = $$OUT_PWD/SrcPony/version.h # write_file... win32 { # Makes sure we use correct subsystem on Windows. # !contains(QMAKE_TARGET.arch, x86_64) { # message(rssguard: Compilling x86 variant.) # QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 # } else { # message(rssguard: Compilling x86_64 variant.) # QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.02 # } # QMAKE_TARGET_COMPANY = $$APP_AUTHOR # QMAKE_TARGET_DESCRIPTION = $$APP_NAME # QMAKE_TARGET_COPYRIGHT = $$APP_COPYRIGHT # QMAKE_TARGET_PRODUCT = $$APP_NAME } INCLUDEPATH += qhexedit2/src SOURCES += SrcPony/aboutmdlg.cpp \ SrcPony/main.cpp \ SrcPony/e2app.cpp \ SrcPony/at25xxx.cpp \ SrcPony/at93cbus.cpp \ SrcPony/crc.cpp \ SrcPony/e24xx-1.cpp \ SrcPony/e24xx-2.cpp \ SrcPony/e24xx.cpp \ SrcPony/e24xx-5.cpp \ SrcPony/e2profil.cpp \ SrcPony/fusemdlg.cpp \ SrcPony/bitfield.cpp \ SrcPony/blockmdlg.cpp \ SrcPony/intfbuf.cpp \ SrcPony/lpt_io_interf.cpp \ SrcPony/pgminter.cpp \ SrcPony/picbus.cpp \ SrcPony/progoption.cpp \ SrcPony/sernumdlg.cpp \ SrcPony/x2444.cpp \ SrcPony/at17xxx.cpp \ SrcPony/at89sbus.cpp \ SrcPony/at93cxx8.cpp \ SrcPony/csmfbuf.cpp \ SrcPony/e2cmdw.cpp \ SrcPony/e2awinfo.cpp \ SrcPony/easyi2c_interf.cpp \ SrcPony/i2cbus.cpp \ SrcPony/ispinterf.cpp \ SrcPony/microbus.cpp \ SrcPony/pic125xx.cpp \ SrcPony/picbusnew.cpp \ SrcPony/spi-bus.cpp \ SrcPony/at250bus2.cpp \ SrcPony/at89sxx.cpp \ SrcPony/at93cxx.cpp \ SrcPony/device.cpp \ SrcPony/eeptypes.cpp \ SrcPony/imbus.cpp \ SrcPony/linuxsysfsint.cpp \ SrcPony/pic12bus.cpp \ SrcPony/ponyioint.cpp \ SrcPony/rs232int.cpp \ SrcPony/at250bus.cpp \ SrcPony/at90sbus.cpp \ SrcPony/binfbuf.cpp \ SrcPony/dt006interf.cpp \ SrcPony/e2dlg.cpp \ SrcPony/filebuf.cpp \ SrcPony/infomdlg.cpp \ SrcPony/lpt_ext_interf.cpp \ SrcPony/motsfbuf.cpp \ SrcPony/pic168xx.cpp \ SrcPony/portint.cpp \ SrcPony/sde2506.cpp \ SrcPony/wait.cpp \ SrcPony/at250xx.cpp \ SrcPony/at90sxx.cpp \ SrcPony/busio.cpp \ SrcPony/e2401.cpp \ SrcPony/e2pfbuf.cpp \ SrcPony/filldlg.cpp \ SrcPony/interfconv.cpp \ SrcPony/lptinterf.cpp \ SrcPony/mpsse_interf.cpp \ SrcPony/nvm3060.cpp \ SrcPony/pic16xx.cpp \ SrcPony/x2444bus.cpp \ SrcPony/sdebus.cpp \ SrcPony/Translator.cpp \ SrcPony/usbwatcher.cpp \ SrcPony/prefdialog.cpp \ qhexedit2/src/chunks.cpp \ qhexedit2/src/commands.cpp \ qhexedit2/src/qhexedit.cpp HEADERS += SrcPony/e2app.h \ SrcPony/e2awinfo.h \ SrcPony/e2cmdw.h \ SrcPony/globals.h \ SrcPony/device.h \ SrcPony/microbus.h \ SrcPony/aboutmdlg.h \ SrcPony/at25xxx.h \ SrcPony/at93cbus.h \ SrcPony/busio.h \ SrcPony/dt006interf.h \ SrcPony/e24xx.h \ SrcPony/e2dlg.h \ SrcPony/eeptypes.h \ SrcPony/ispinterf.h \ SrcPony/lpt_io_interf.h \ SrcPony/pgminter.h \ SrcPony/picbus.h \ SrcPony/sde2506.h \ SrcPony/at17xxx.h \ SrcPony/at89sbus.h \ SrcPony/at93cxx8.h \ SrcPony/e2401.h \ SrcPony/e2pfbuf.h \ SrcPony/errcode.h \ SrcPony/i2cbus.h \ SrcPony/jdminter.h \ SrcPony/pic125xx.h \ SrcPony/picbusnew.h \ SrcPony/progoption.h \ SrcPony/sdebus.h \ SrcPony/types.h \ SrcPony/at250bus2.h \ SrcPony/at89sxx.h \ SrcPony/at93cxx.h \ SrcPony/crc.h \ SrcPony/e24xx-1.h \ SrcPony/e2phead.h \ SrcPony/filebuf.h \ SrcPony/imbus.h \ SrcPony/linuxsysfsint.h \ SrcPony/pic12bus.h \ SrcPony/ponyioint.h \ SrcPony/resource.h \ SrcPony/sernumdlg.h \ SrcPony/wait.h \ SrcPony/at250bus.h \ SrcPony/at90sbus.h \ SrcPony/binfbuf.h \ SrcPony/csmfbuf.h \ SrcPony/e24xx-2.h \ SrcPony/e2profil.h \ SrcPony/filldlg.h \ SrcPony/infomdlg.h \ SrcPony/lpt_ext_interf.h \ SrcPony/motsfbuf.h \ SrcPony/pic168xx.h \ SrcPony/portint.h \ SrcPony/spi-bus.h \ SrcPony/x2444bus.h \ SrcPony/at250xx.h \ SrcPony/at90sxx.h \ SrcPony/businter.h \ SrcPony/e24xx-5.h \ SrcPony/easyi2c_interf.h \ SrcPony/fusemdlg.h \ SrcPony/bitfield.h \ SrcPony/blockmdlg.h \ SrcPony/intfbuf.h \ SrcPony/lptinterf.h \ SrcPony/mpsse_interf.h \ SrcPony/nvm3060.h \ SrcPony/pic16xx.h \ SrcPony/ppuser.h \ SrcPony/rs232int.h \ SrcPony/x2444.h \ SrcPony/Translator.h \ SrcPony/interfconv.h \ SrcPony/usbwatcher.h \ SrcPony/prefdialog.h \ qhexedit2/src/chunks.h \ qhexedit2/src/commands.h \ qhexedit2/src/qhexedit.h FORMS += SrcPony/forms/aboutdlg.ui \ SrcPony/forms/editdlg.ui \ SrcPony/forms/bitfield.ui \ SrcPony/forms/notesdlg.ui \ SrcPony/forms/e2dlg.ui \ SrcPony/forms/fusedlg.ui \ SrcPony/forms/mainwindow.ui \ SrcPony/forms/osccalibr.ui \ SrcPony/forms/progoption.ui \ SrcPony/forms/sernumcfg.ui \ SrcPony/forms/prefdialog.ui # for next version, when script for ts files convertion is implemented #TRANSLATIONS += localization/qtbase_cs.ts # TODO: please check this #win32:LIBS += -L$$PWD/windows/ #win64:LIBS += -L$$PWD/windows/ # TODO: please add this for macx # macx:LIBS += # in case of manually installations, not from repositories unix:!macx: LIBS += -L/usr/local/lib #libftdi unix:!macx: QMAKE_CXXFLAGS += $$system(pkg-config libftdipp1 --cflags) unix:!macx: LIBS += $$system(pkg-config libftdipp1 --libs) #win32: FTDIPATH = c:/libftdi1-1.4_devkit_mingw32_24June2018 win32: FTDIPATH = c:/libftdi1-1.4git_devkit_x86_x64_14June2018 win32: QMAKE_CXXFLAGS += -I $$FTDIPATH/include/libftdi -I $$FTDIPATH/include/libusb-1.0 -I $$FTDIPATH/include win32: LIBS += -L $$FTDIPATH/lib32 -lftdipp1 -lftdi1 -lusb-1.0 # # Make sure QM translations are generated. # lrelease.input = TRANSLATIONS # lrelease.output = $$OUT_PWD/translations/${QMAKE_FILE_BASE}.qm # lrelease.commands = $$LRELEASE_EXECUTABLE -compress ${QMAKE_FILE_IN} -qm $$OUT_PWD/translations/${QMAKE_FILE_BASE}.qm # lrelease.CONFIG += no_link target_predeps # # Create new "make lupdate" target. # lupdate.target = lupdate # lupdate.commands = lupdate $$shell_path($$PWD/rssguard.pro) -ts $$shell_path($$TRANSLATIONS_WO_QT) # # QMAKE_EXTRA_TARGETS += lupdate # QMAKE_EXTRA_COMPILERS += lrelease RESOURCES += SrcPony/ponyprog.qrc CONFIG(debug, debug|release) { # debug configuration # QMAKE_CXXFLAGS_DEBUG += ... } else { # release configuration #QMAKE_CXXFLAGS_RELEASE -= -O2 #QMAKE_CXXFLAGS_RELEASE += -O3 #QMAKE_CXXFLAGS_RELEASE += -fno-exceptions -fno-rtti DEFINES += QT_NO_DEBUG_OUTPUT QT_USE_FAST_CONCATENATION QT_USE_FAST_OPERATOR_PLUS } # -Wall are already on the command line (where does it come from?) # for old GCC -std=c++11 move to -std=c++0x QMAKE_CXXFLAGS += -Wno-unused-parameter unix: QMAKE_CXXFLAGS += -std=c++11 # EK 2017 win32 { target.path = $$PWD/distribution/innosetup ponydeploy.path = $$PWD/distribution/innosetup ponydeploy.extra = windeployqt --no-angle --no-opengl-sw --release --list relative $$PWD/distribution/innosetup/${TARGET} lang.path = $$PWD/distribution/innosetup/lang lang.files = lang/* inpoutdll.path = $$PWD/distribution/innosetup inpoutdll.files = InpOutLib/Win32/inpout32.dll inpoutexe.path = $$PWD/distribution/innosetup inpoutexe.files = InpOutLib/InstallDriver/InstallDriver.exe #DEPLOY_TARGET = $$shell_quote($$shell_path($${OUT_PWD}/release/$${TARGET}$${TARGET_CUSTOM_EXT})) # isEmpty(QTDIR):QTDIR = "c:/Qt/Qt$$QT_VERSION/$$QT_VERSION/mingw530_32" # isEmpty(MINGWDIR):MINGWDIR = "c:/Qt/Qt$$QT_VERSION/Tools/mingw530_32" isEmpty(ISCC):ISCC = "c:\Program Files\Inno Setup 5\ISCC.exe" # message(ponyprog: MINGWdir: \"$$MINGWDIR\") message(ponyprog: ISCCdir: \"$$ISCC\") win32setup.depends = install win32setup.target = win32setup win32setup.commands = $$ISCC /DAPPNAME=$$APP_NAME \ /DAPPVERSION=$$APP_VERSION \ /DAPPCOPYRIGHT=\"$$APP_COPYRIGHT\" \ $$PWD/distribution/innosetup/ponyprog.iss QMAKE_EXTRA_TARGETS += win32setup INSTALLS += target lang inpoutexe inpoutdll ponydeploy #QMAKE_POST_LINK = windeployqt --no-angle --no-opengl-sw --release --list relative ${TARGET} } # Install all files on Linux. unix:!mac { target.path = $$PREFIX/bin misc_texts.files = $$TEXTS misc_texts.path = $$quote($$PREFIX/share/$$TARGET/information/) desktop_file.files = desktop/$${TARGET}.desktop desktop_file.path = $$quote($$PREFIX/share/applications/) translations.files = $$OUT_PWD/lang translations.path = $$quote($$PREFIX/share/$$TARGET/lang/) INSTALLS += target misc_texts \ desktop_file translations } mac { CONFIG -= app_bundle target.path = $$quote($$PREFIX/Contents/MacOs/) misc_texts.files = $$TEXTS misc_texts.path = $$quote($$PREFIX/Contents/Resources/information/) translations.files = $$OUT_PWD/lang translations.path = $$quote($$PREFIX/Contents/Resources/lang/) INSTALLS += target misc_texts translations } tmp9balx013/.gitignore0000644000175000017500000000020013616566001014706 0ustar carstencarsten.directory Thumbs.db .kdev4 build* *.kdev4 CMakeLists.txt.user* ponyprog.pro.user* doxygen/html doxygen/latex SrcPony/version.h tmp9balx013/LICENSE0000644000175000017500000004307613616566001013745 0ustar carstencarsten GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. tmp9balx013/.travis.yml0000644000175000017500000000073413616566001015043 0ustar carstencarstenlanguage: cpp compiler: gcc dist: xenial addons: apt: packages: - g++-5 - pkg-config - libusb-1.0-0 - libusb-1.0-0-dev - libftdi1-2 - libftdi1-dev - libftdipp1-2v5 - libftdipp1-dev #before_install: #- gcc -v #install: # C++11 #- sudo apt-get install -qq g++-5 libftdi1-2 libftdi1-dev libftdipp1-2 libftdipp1-dev script: - qmake ponyprog.pro -r -spec linux-g++-64 CONFIG+=debug QMAKE_CXX=g++-5 QMAKE_LINK=g++-5 - make tmp9balx013/fixyear.sh0000755000175000017500000000065013616566001014735 0ustar carstencarsten#!/bin/bash set -o errexit OLD_YEAR=2019 CURRENT_YEAR=`date +%Y` FILESC=`find -name "*.cpp" -type f` FILESH=`find -name "*.h" -type f` FILES="${FILESC} ${FILESH} ponyprog.pro CMakeLists.txt distribution/innosetup/ponyprog.iss" for i in ${FILES} do if [ -f "${i}" ]; then echo "Converting ${i}" sed -i "s@1997-${OLD_YEAR}@1997-${CURRENT_YEAR}@g" "${i}" else echo "File non esiste: ${i}" fi done exit 0 tmp9balx013/copyright0000644000175000017500000000020513616566001014656 0ustar carstencarstenAuthor(s): Claudio Lanconelli Copyright: License: GPLv2 tmp9balx013/create_elf_binary.sh0000755000175000017500000000104313616566001016720 0ustar carstencarsten#!/bin/bash CMD=$(type -p cmake) if [ ! -x "$CMD" ]; then # not found exit echo "please install cmake and restart this script" exit 1 fi CPU_NUM=$(nproc --all) echo "cpu cores: $CPU_NUM" DIRECTORY="build" if [ ! -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists. mkdir "$DIRECTORY" fi # because of removing of all files in directory if [ -d "$DIRECTORY" ]; then cd "$DIRECTORY" rm * -rf cmake -DUSE_DEBUGGER=OFF -DUSE_QT5=ON .. make -j$CPU_NUM cd .. #mv ./$DIRECTORY/ponyprog . fi tmp9balx013/distribution/0000755000175000017500000000000013616566001015445 5ustar carstencarstentmp9balx013/distribution/osx/0000755000175000017500000000000013616566001016256 5ustar carstencarstentmp9balx013/distribution/osx/bundle/0000755000175000017500000000000013616566001017527 5ustar carstencarstentmp9balx013/distribution/osx/bundle/Info.plist.in0000644000175000017500000000174413616566001022112 0ustar carstencarsten CFBundleDevelopmentRegion English CFBundleExecutable Ponyprog CFBundleGetInfoString @APP_VERSION@, @APP_COPYRIGHT@ CFBundleIconFile Ponyprog CFBundleIdentifier org.ponyprog.Ponyprog CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString @APP_VERSION@ CFBundleSignature Ponyprog CFBundleVersion @APP_VERSION@ NSHumanReadableCopyright @PONYPROG_COPYRIGHT@ LSMinimumSystemVersion 10.5 tmp9balx013/distribution/osx/bundle/CMakeLists.txt0000644000175000017500000000126013616566001022266 0ustar carstencarsten# Generate an application bundle (new-style) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-bundle.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-bundle.cpack) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist @ONLY) ADD_CUSTOM_TARGET(package-binary-bundle ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-bundle.cpack ) # Upload the binary bundle to SourceForge for use with the FRS ADD_CUSTOM_TARGET(upload-binary-bundle rsync -avP -e ssh ${CMAKE_CURRENT_BINARY_DIR}/ponyprog-setup-${APP_VERSION}-${CMAKE_SYSTEM_PROCESSOR}.dmg ${PONYPROG_SOURCEFORGE_USERNAME}@frs.sourceforge.net:uploads/ ) tmp9balx013/distribution/osx/bundle/ponyprog-startup0000644000175000017500000000312113616566001023024 0ustar carstencarsten#!/bin/sh # # Author: Aaron Voisine # Inkscape Modifications: Michael Wybrow # Ponyprog Modifications: Timothy M. Shead echo "INFO: Starting $0" PONYPROG_BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/Ponyprog//'`" PONYPROG_RESOURCES="$PONYPROG_BUNDLE/Contents/Resources" PONYPROG_TEMP="/tmp/ponyprog/$UID" PONYPROG_ETC="$PONYPROG_TEMP/etc" PONYPROG_PANGO_RC_FILE="$PONYPROG_ETC/pango/pangorc" rm -rf "$PONYPROG_TEMP" mkdir -p "$PONYPROG_ETC/pango" sed -e 's|/opt/local/etc|'"$PONYPROG_ETC|g" "$PONYPROG_RESOURCES/etc/pango/pangorc" > "$PONYPROG_ETC/pango/pangorc" sed -e 's|/opt/local|\"'"$PONYPROG_RESOURCES|g" -e "s/\.so/.so\"/g" "$PONYPROG_RESOURCES/etc/pango/pango.modules" > "$PONYPROG_ETC/pango/pango.modules" sed -e 's|/opt/local|'"$PONYPROG_RESOURCES|g" -e "s/\.so/.so\"/g" "$PONYPROG_RESOURCES/etc/gtk-2.0/gdk-pixbuf.loaders" > "$PONYPROG_ETC/gdk-pixbuf.loaders" cp -f "$PONYPROG_RESOURCES/etc/pango/pangox.aliases" "$PONYPROG_ETC/pango/pangox.aliases" export "DYLD_LIBRARY_PATH=$PONYPROG_RESOURCES/lib" export "FONTCONFIG_PATH=$PONYPROG_RESOURCES/etc/fonts" export "GDK_PIXBUF_MODULE_FILE=$PONYPROG_ETC/gdk-pixbuf.loaders" export "GTK_PATH=$PONYPROG_RESOURCES/lib/gtk-2.0" export "PANGO_RC_FILE=$PONYPROG_PANGO_RC_FILE" export "PATH=$PONYPROG_RESOURCES/bin:$PATH" export exec "$PONYPROG_RESOURCES/bin/ponyprog" "--log-level=debug" "--plugins=$PONYPROG_RESOURCES/lib/ponyprog/plugins" "--share=$PONYPROG_RESOURCES/share/ponyprog" "--ui=$PONYPROG_RESOURCES/lib/ponyprog/plugins/ponyprog-ngui.module" echo "INFO: Finishing $0" tmp9balx013/distribution/osx/bundle/package-binary-bundle.cpack.in0000644000175000017500000000135013616566001025262 0ustar carstencarstenSET(CPACK_BUNDLE_ICON "${share_SOURCE_DIR}/icons/ponyprog.icns") SET(CPACK_BUNDLE_NAME "Ponyprog") SET(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist") SET(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/ponyprog-startup") SET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "Bundle") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "ponyprog-setup-${APP_VERSION}-${CMAKE_SYSTEM_PROCESSOR}") SET(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/volume.icns") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") tmp9balx013/distribution/osx/dependencies.cmake.in0000644000175000017500000000164513616566001022321 0ustar carstencarstenINCLUDE(GetPrerequisites) SET(SKIP_FILES "^/usr/X11.*$" ) FOREACH(LOCATION @PONYPROG_BINARY_LOCATIONS@) MESSAGE(STATUS "Installing: ${LOCATION} dependencies") # Excludes system dependencies, but finds recursive dependencies GET_PREREQUISITES(${LOCATION} DEPENDENCIES 1 0 "" "") FOREACH(DEPENDENCY ${DEPENDENCIES}) GET_FILENAME_COMPONENT(DEPENDENCY_NAME "${DEPENDENCY}" NAME) GET_FILENAME_COMPONENT(DEPENDENCY_ACTUAL "${DEPENDENCY}" REALPATH) SET(INSTALL_FILE 1) FOREACH(SKIP_FILE ${SKIP_FILES}) IF(DEPENDENCY_ACTUAL MATCHES "${SKIP_FILE}") SET(INSTALL_FILE 0) BREAK() ENDIF() ENDFOREACH() IF(INSTALL_FILE) MESSAGE(STATUS "Copying ${DEPENDENCY_ACTUAL} to ${CMAKE_INSTALL_PREFIX}/lib/${DEPENDENCY_NAME}") EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DEPENDENCY_ACTUAL}" "${CMAKE_INSTALL_PREFIX}/lib/${DEPENDENCY_NAME}" ) ENDIF() ENDFOREACH() ENDFOREACH() tmp9balx013/distribution/osx/CMakeLists.txt0000644000175000017500000000537213616566001021025 0ustar carstencarsten#OPTION(PONYPROG_INSTALL_AQSIS "Include Aqsis in the K-3D installer" OFF) #OPTION(PONYPROG_INSTALL_CGKIT "Include cgkit in the K-3D installer" OFF) #OPTION(PONYPROG_INSTALL_PYGTK "Include PyGTK in the K-3D installer" OFF) #OPTION(PONYPROG_INSTALL_PYOPENGL "Include PyOpenGL in the K-3D installer" OFF) #OPTION(PONYPROG_INSTALL_PYTHON "Include Python in the K-3D installer" ON) OPTION(PONYPROG_CREATE_PACKAGEMAKER_PACKAGE "Include an option to build a MacOSX PackageMaker package." OFF) SET(PONYPROG_BINARY_LOCATIONS ) LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-make-module-proxy") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-renderframe") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-renderjob") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-resource-compiler") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-sl2xml") LIST(APPEND PONYPROG_BINARY_LOCATIONS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ponyprog-uuidgen") FILE(GLOB_RECURSE PONYPROG_PLUGIN_BINARIES "${PONYPROG_BINARY_DIR}/${PONYPROG_LIBDIR}/ponyprog/plugins/*.module") LIST(APPEND PONYPROG_BINARY_LOCATIONS ${PONYPROG_PLUGIN_BINARIES}) # Enable automatic installation of library dependencies ... CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/dependencies.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake" @ONLY) INSTALL(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake") # Install some runtime dependencies that can't be detected via static analysis ... # This is an ugly hack, we should be able to detect this automatically, but I'm feeling lazy ... SET(PONYPROG_MACPORTS_DIR "/opt/local" CACHE PATH "Root directory containing installed MacPorts packages") MARK_AS_ADVANCED(PONYPROG_MACPORTS_DIR) INSTALL( PROGRAMS ${PONYPROG_MACPORTS_DIR}/lib/libgailutil.18.dylib DESTINATION lib ) INSTALL( DIRECTORY ${PONYPROG_MACPORTS_DIR}/lib/gtk-2.0/2.10.0 DESTINATION lib/gtk-2.0 USE_SOURCE_PERMISSIONS ) INSTALL( DIRECTORY ${PONYPROG_MACPORTS_DIR}/lib/gtk-2.0/modules DESTINATION lib/gtk-2.0/2.10.0 USE_SOURCE_PERMISSIONS ) INSTALL( DIRECTORY ${PONYPROG_MACPORTS_DIR}/lib/pango DESTINATION lib USE_SOURCE_PERMISSIONS ) INSTALL( DIRECTORY ${PONYPROG_MACPORTS_DIR}/etc/gtk-2.0 ${PONYPROG_MACPORTS_DIR}/etc/fonts ${PONYPROG_MACPORTS_DIR}/etc/pango DESTINATION etc ) # Bundle packaging is always available ... ADD_SUBDIRECTORY(bundle) # We optionally support creating packagemaker packages ... IF(PONYPROG_CREATE_PACKAGEMAKER_PACKAGE) ADD_SUBDIRECTORY(packagemaker) ENDIF(PONYPROG_CREATE_PACKAGEMAKER_PACKAGE) # INCLUDE(CPack) tmp9balx013/distribution/osx/packagemaker/0000755000175000017500000000000013616566001020671 5ustar carstencarstentmp9balx013/distribution/osx/packagemaker/CMakeLists.txt0000644000175000017500000000137713616566001023441 0ustar carstencarsten# The CPack PackageMaker generator ignores CMAKE_INSTALL_PREFIX and places everything in /usr, complain if there is a mismatch IF(NOT "${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr") MESSAGE(SEND_ERROR "PONYPROG_CREATE_PACKAGEMAKER_PACKAGE requires CMAKE_INSTALL_PREFIX set to \"/usr\".") ENDIF(NOT "${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr") # Generate a packagemaker package ... CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/LICENSE ${CMAKE_CURRENT_BINARY_DIR}/COPYING.txt COPYONLY) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-packagemaker.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-packagemaker.cpack) ADD_CUSTOM_TARGET(package-binary-packagemaker ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-packagemaker.cpack ) tmp9balx013/distribution/osx/packagemaker/package-binary-packagemaker.cpack.in0000644000175000017500000000137213616566001027572 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "PackageMaker") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_EXECUTABLES "ponyprog" "Ponyprog ${APP_VERSION}") SET(CPACK_PACKAGE_FILE_NAME "ponyprog-setup-${APP_VERSION}-${CMAKE_SYSTEM_PROCESSOR}") SET(CPACK_PACKAGE_NAME "Ponyprog") SET(CPACK_PACKAGE_VENDOR "http://ponyprog.sourceforge.net/") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE") SET(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README") #SET(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_SOURCE_DIR}/welcome.txt") tmp9balx013/distribution/osx/packagemaker/readme.txt0000644000175000017500000000024013616566001022663 0ustar carstencarstenPonyprog is licensed under the GNU General Public License. For further information, visit the Ponyprog web site: http://ponyprog.sourceforge.net/ Thank You tmp9balx013/distribution/osx/packagemaker/welcome.txt0000644000175000017500000000011313616566001023060 0ustar carstencarstenPonyprog is a complete free GUI for EEPROM and microcontroller flashing. tmp9balx013/distribution/innosetup/0000755000175000017500000000000013616566001017471 5ustar carstencarstentmp9balx013/distribution/innosetup/sernumdlg.jpg0000644000175000017500000004300113616566001022171 0ustar carstencarstenJFIF``Created with GIMPC  #!!!$'$ & ! C  h tؼ?;덏/<Y:39l<_>%^Oƭ^:ŻۋO/nS>=k[Nv;@k wy)qiI&6j\d;B5u.}OkzRI$$I$AAH 8-Vs}$A$ " A U3{p$I۵ӗs+\M6z™l)™l)™l)ih-2S-*R*R*Xuӿ5z*z׍&cf-U@*ʜr,jr 1 l$!Ԑ:?S9ΘQӳl@#<6z@Jjlw:elwA(J` C7vӿŢ%K9,rXc%K9,rXPHmڡmڡmڡmڡmڡmڡmڡi8Ovm㘍aՀTN%N=c$Z5$?B)OCnQ[V+uEnQ[V+u9d/Cd#,2#,2#,2#&IN>O($!/?PNt>U|c8$GSGQ?`/ƨӰ]}Q,YDe%K(@Yd + V@Yd +(S=.*ثb*ثb*ثb*ثb*ثb*ثb>(,1LiEtnݢߟ}_ cIʡu)_ܟ"3!LBEE 8af$b4n'}/eobC~~T:_+B Ƨ6X_J@$k:TI)oYNji;᪉CDtC3TtLhS,&ѥeq0_ٝ1G>eG̣""M[s-ne2ۙm̜fL'E",DXb"Nze3ͪ5H*ZTT U!U3j֏GnmIa$1N-P8 MS?4:bZ(if=VU.|=?fG 8p,YgT{ӌ%K(Q,YDe%K[2Oѝ[lUV[lUVZݶ[lUV[lUVDz>e=DKQ-DKQ-DKQ-DKQ-DKQ-DKQ-Dg53@Qq1R!b 02A"a?h꾯UvTEF$HReWŵV+Q40V5z&i~U5*<"gp֩4D8x%䗺*? |EyU/OotL` #meP0H@ ~ yg%#Rσ9.;8O$48 < ̧S&sG 7ꤪBB\k(z#'/v*>|X?݇ʳ!YYYYYYYYYYYYYYGg/݆v݆v݆v݆v݆v݆v݆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v͆v 4ZD]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]CE;D]C*3@QRq!1b 0A"2?&j |+nZI&|lwl7u4bG#B[|`M=@Y** @yLNwOsuYyMqAo_#@?NT5|X ET`Yo`vOo}]G6vMhhNi"~BU= GW*_Ыz~BU= GW*_Ыz~BU= GW*_Ыz~BU=؎;6#͈T:7t^$^$^$^$^$^$^$^$^$^$^$^$^$^$Mݭw6#_#0MW?L6b;\BP_*W UBP_*W /Msb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;؎;6#͈sb;<Ҩɴ2m*J&Ҩɴ2m*J&Ҩɴ2m*J&Ҩɴ2m*J&Ҩɴ2m*J&Ҩɴ2m*J&Ҩɴ2m*OA!123r"0AQq a#@BRbC4Ds?&Vٰ)E޶)>faWpWpWpWpWpWpWpWpWpWpW`yUPڮ2l"lqu*;]P1ޛT+duStxm763HC Қq{@m pdӘ)s5$>% ͟OiFNtf[r3mQzi`/ijn1qF&(QۧD -cn%)4 Jd*9O 19ʒ֑e$\XI'JDDZASZY19 S\~ \ڇRM{6V&,LX1bbō6,lXرcXرcbō&,LX1bbʼn|̖aXVr\W+r\W+ °(pBnDXδ ,, #ZL3KUXYaeXYaE"R ^CI%:"B.q?b˨|_`Bb69HH\͵Yp  s Α Ã6C53D6ҶatiISݽ?oh+gE]kRQ4Mte]kRZN"B(k*ʠ%/1+ Xml#x{7x{=fs (UMDtLx5 \Zy  %|mTZ{,gL[}Nub2|˷i[}Nub2|stάFSlsu]1ڴ%%cFT/mpBnz1|NK>'%ωgrY9,|NK>'%ωgrFI/mpBnkḂ³!|+2 ̇³!|+2 ̇³!|+2 ̇³!Ȓ ^ѩufC0 KoizaT|ɴXD;{}ZX^9ȁw\wG;\=Л=,'{b\Wlaf-% v[=Aىm\y{3Il8;&3 ˮ#LKXX+,Yoe%K-[,Yoe%K-|؝5 ߩ> %\W?U*s \W?U*bwt&ot\7EBNIEP?*mEVut'y{ pBfB3zM)Ӗ0 0.Z-n%svvY^\=Й={ ^[7B q,|agC :Y·t>0,|Af 6Y͇l> a,|Af 6Y͇l> \.:ٺ5a XB,!a XB,!a XB,#f@w+ܬ&jkf"_K*=[H.5QsSC7Bf|c(ʫ-)hQmI0)&aZ;Cʢi2Ei/P7F3a<;[gZtQ#] :obHlMDt#i?eANaMz]ZiLl8"Ue8;n!\'obF 7eWPЬ2+ 欄j][:L3}s7GY~n^4:%#*:*r{'kGBk\CIT1&/PaS=6XwDeIMƓMy}u"9 2l=ǹl휮2tevPz&@p0NoXИOo8P Sa3y7:$r&EӆINj8l'[+ȅ=/uP" J3Z&tG}aH:v-AW ԵvO+ʌɶo"Q o}vpll&GW9pb҉ø L jfMTgLoLG Y/U BcSꕓOȲp]Xna%#Ի L ߪyd+B4ͳ(nkC -sTm?%11gz.؂H%DvKww]솦n}} LS,LuCS7BnD.NեeK%=;,P8m"mtz>2rQ_7KePsFMV*hp$L'Ī0O0 ^fE7SЛ=I=.5WGw D*,=m m U|z9JhbV5,t wb h; L .CS7Bnմ[Hfm[#v1!bpѵ9NꌔFcOW7o!rsko!D8tww!lCڦS4V8 N+@),!wm-TcgH&i0rw ǰ7OIav@l9LtHP`5^v(2|&EX/d53t!㪫Z{oy"& (m`_(jfXͭ,,,,™f5aXy<k5o诔aeഃq'/-c?=ƣm-iq䡸DilJp2?VlkCDg+y&F.er;XD鼨pBu Ҧww( f@%9y蠺t,Z&'49n#E|7Cd6K  k{'[A:솦n1?Qχ|>0,|ag >YžՆ]Fҳ,|AgC :Y·t>  >B,!a XB^,!a XBjdX;Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}Vs}u)!1AQaq 0@?!(,m@lC&xf 69CF`&Ioě&Ioě&Ioě&Ioě&Ioě'8A 7qH!;(vRX qRCK'q3Fb2p`e89j;&9D`(]c$gaCvdB$xxaL1!TqGW. QNx3 s#BN#a `qǭ`S@!`l:rGoYpX.k;'Xtne 3035PYhW$ȸ=Gs|t=C=|=žOpS)=+C={w;wZt,)*>Ox ܭܭܭɶ2vnVjVjVjP}ﲡʌ)*>D0w'j @ HCx)3rBcS$)pqx"AXp<~ "Xm$Ip@rE &雨ac˿MfYg"; H<$aèth-F]ˎ04^0x0dթ\KN@TO-bᬔ-'$/$%ȯ~ ѓ`-"L' f\fg+!,ȇR2 -3"t{F]JfCB 셔C@lCt,$X+ $q{m m)< ;H^dDZRB19K.,062P09='PjBIp2 w$ajM _;fh#=|pe`2eALp݈ia0؁?"3S2 h  S`E G‘ UgeVvUgeVvUgd'>O}d'>O}d' 8R2U>'&A@fBt쁝 i{78W͈`9$CE`qм ndZdLBf1Ty#vpt a.XN_›Gt OU"aIKeOdSmJ-#)$I)$I$I$Immm[mm6YM{}$I$#}F@M1$I"3b6[mmdfmmmĒ$I5+mۑ% I* knI%-F$m)bI,I%I$YI$I$I$K?)!1AQ 0@aqၑ?(2Z6pö09BS8g1AdrCO~0ykYyk`; KflK>0`9c'g)ȏ"i3X1`lm9!rr7S,F2 ]&uF'px; ~fmO!y-xbN3 fcϐw᳘Nwc 00(  ftNC8 ||kbRdaA+';aЁLjcI$:f<0BQZ[dbAA A6,r97Dpd!p̊ȟqQ)L㴾4ƒ_KI|i/%4ƒ_KI|i/%4ƒ_KI|i/%4ƒӅan>6͇{lt@3׶mGF7NKfýl:uqR͇HpOR') D"}‘>HpOR') D r9Kfä888Kfäs댹-Ϯ2l:DEQEQEQE-a6l!%aD%aqqqqq| QEQEQEQEQEQr\6}a]aýl!.{ˆÂl;ۆ8>a7 =pCvÍaێ7 =pC܎7 <n{nb1F#b1ňb1F#KÔ=!ÔHql9OLq86Ԉ  땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y땞Y) !1@A Q0aq?үeR`5T(J>YCbJ  CJWEw@+zFPn5eGK ﳅP]QdRWao?U`4RԊ7@/+#(HtTU> z=MV|(`ePqz3G|i CW( AH$Ӭo)E[OP 2|˰@Dc$&htUrD,BAontp#YBj_P"tEWEҸ1 @.}nt-Inp5 fk7Ynp5 fk7Ynp5 fk7Ynp5LC8+!8: ef!3 (( f)@OɬnMcrkXܚ7&5ɬnMcrkXܚ 1LTQEQEQEQt=qLE^3zS?H888ㇳۊg=sيgb\bqLvS;n)ۊgLbSj3袊(((((.S;Qgj=qLG)ϩӊgm3qLq1LvS>QE]TQEQEf)hvS>QEQv#b(G8$|000000000000000000000000000)!1AQaq0 @? WfP,tQ:d;^,^;rfE%y3'nNܝ;rvۓ'nNܝ;rvۓ'nNܝ;rdPx c{ F!blҡ]C)W!:t^d*sd-GX[?^ ``fK0\PLZڜ(jt JEIJfFu4ET*"sMgKb,UiP e׃ة [wGryNX?:1UiF9y Yؖ*k `CG9YBȠxz8o7P- -:L:MWt[^+wCXょC*.+moy #-8(+J1J85*wnX0PS[K Q]'0ڤ&'2ɜ^)Ŗ!aL-Te6&!7xwW/imi)V)ZqygbP䶵MZ- ߟ~<4i˿\ӣS Lߟ~ \l 0 a,X>ubnCvv,}>Ηtnu'۬~gK>,ς̈́嫨0\r I8'gNΝ;:vt`'xX{&s5gNΝ;v4ic 1_<!oF(IQh1rReCf Pz5h;KS c+F:$ ![A4o .u\y.;b*XPWzu@ R,]]&ӖUnCa`͈s \!JKmKح l[Z) HP`XSv6Qpޔh7:QPh飈8ڨVwrtt 0?S;5 ,Ilh=:& 7rgfd5GFP2У8"p"uhšq#(Scu 'PBu 'Py_*B˗.\qn}EVWJ*TRJ*TIy2/ݕe.\rˆ3P۷nݻv۷nݻc1QWM6vU#7aU3( gY;CP7(\Ƃ eIr˟M-i쫗pBMTqem֪qBjGk2;s@YVBkFK.\NMAв0ݕp}Ü3~Qf%mbO;rпǏYQK9-A,Zւ# VL&s k9.\r˗v$K:07k.)W@7D֋\rx/? O?Xb<!sbӝ ¨BXEYsuje3M ^]ukUk)%G=IAJN ʅV }εVp(Z"T]f.QAF/aaOS G.\r˗.8d(X4Թr˗.\r.'{.\r˗.\r˗.\rˋ<`?  Ȉ|*R-JֈM{G~$3l Y<]Sz&qԃQKUEd2#V(z*YIN)`@`N0oC4S8,J,5KhqB4Wp(6RNfB3[+Y@ 뒠&\r˗.\^DX4KׁuQ"Cl6!z}P* qqR@TjF<e"b%j4Lh7FrXhxXY4hZ̴F:Rff`!ldFУGa`ari2.tڛz\qc(Ax7r˗.\ Gx&ޢV|Ŧ(\r˗.\r˗.\rˏ~/BZXxp{üüüüþþþþþþþþþþþþþþþþþþ&)"e.\r˗** 2)Y.#!o!WThANkՊX_DPro$aXv%j9]/ .\rˍc^س.\rˀ5nWz1iteFJ06_OMֲb9EuNi,a, t\r˗.?v7ྞر::::::::::::::::::::::::sP>Uk+-CZx)"ҫDu"UtZ,NO.5e''s2m)QX鏈c;FP(i][\TlhRd[Pζ1[l~_zcoG!(<ҨpjnZZmTnYq[Ɖ'X?X(T6:vk] Lة`&|992Ef%*IPMk@JڑKyĸk:1ZT8 Ѫyz@P*W0SEW1YFF7]`P e yD(ߋb˗.\r˗.\r˗.\sa &\U3%`඾SAVZLow\,'8b 0K"> 0!XT" ,H0(r˗.\r˗.\|vFσ1 A|e/  *BMъ<?}>GϣgYBp?卲|bz;VtKVRihZƔ3-.PYkc'^S<4#j-J#` Js5+aKNgy%':p|Е^! %Ea_1h7"F 5T(ض)䮚rBЩDJ:G P-(4'^w>g?4O49àjgp[Xʿ PJWiۖ1@VHSTRJ-T}@Eb2CRJ*Tܷ*>W`x\'dNȝ;"vD+xR.vD'dNȝ;"RO% +B N0` 0` 0` 1c tmp9balx013/distribution/innosetup/PonyProg.url0000644000175000017500000000005513616566001021772 0ustar carstencarsten[InternetShortcut] URL=http://www.LancOS.com/tmp9balx013/distribution/innosetup/oksound.wav0000644000175000017500000005101213616566001021671 0ustar carstencarstenRIFFRWAVEfmt ++dataQ}~~~}}}~}}}~~}~~}~~~~~~}}}{}~z{{}~}|}|}~}}y{{~{|z}zhn}z{ztwzz{wntzx}zrzuxqnuwii}ptzqnxzzzt{|~x}tcnz{qSMt\Vnnnmnhq]detbYehSYhkhzez}xn_ehetwkbhtxpr}qr{}[hvhRhhJtqhbntPPzwb`tȘP;>\԰\,8bΤn>8hz}\MzVtzzltn]hnSGYԘ>8btP?PSeuhJ\hev\bͶ\Pbhh>8bɰDPzr}tenkbq\Pth\nbRPn\CbShnV`whDDhڼnTeyhPPtnhz}}\Ab^hpctknwqwnuhhzb]nhDHhhPbqth]tuwkchk¤hC\Ƕdht}}nVhbftotxn`n~hV\tbQh[h~ncnyszSGh԰nlzwhYtjqqPPzn_e_ht\trqtqzz_f]b\J\}VVbz}knlwh]h}DAhȀPPeVYmhĘPPjrǼwtnkh\aqn\\԰XObtbhkrt]btΌVShyqp\DbΤ\)PȳD\n\hiqePGzˤbtX_izDPɰt>bflefP*hȘPtԀ8PtPPΘDPt_Yh}P8zȀA԰h_qnhnPhhhưjnqhPYh>DnwQhkv~nKtĘYtÀDV_beDtPMqtPPtnxm~tPPtXezŒVM\zxh\q^\PVzw_enzPDbqdhhhhz\\tnzhVzV˜D6h\h\\\h_tb?\\&hǶ\DhȀSP_hs,8hb€ht^GPbxzthhP;JkhXhYnh>hth_zkDј8DYt,PȀVqټPzhXhØ88ȀYqhPP8PhDt}x΀P€b>5դkhPhhhP8hnxtD\ȀYtټP8b_bw\3hǼYhӰVP}hS}/P\hcnhbk2PhhtwP>ͤh\\bshSt_teddgPbttt_ttunDPhHhPNtZq~H\ebkzhh\tnUnhYztiormnkzhVtuth;Pd_nttqP\lkbnkTt}b\hzhE\PDqr~nPPzPPnbb`db_tk\Ťzzt\hht^}tqvnP\PPzhDVh^hf\RVthPtjth\_t\Pkz\Stt`twhnzqztTenez{\H\J\nhPA\>Dð\PhPbtSYh_thnqjr{ntnthD\Vh\h_\8PȀA\PbtV9bnJVnq\\tnt|ke\bP\htPtPhDJXeTt_h>P\\}xtVehYthb\PihehRPhhGh\h\PY\Dth_t~htPPSbtbz\bw~wkntYİn_hPhV\tbž\D˜\Dhh\zn}hhhVt[hw}zwknwnPPȀAh\>hhbDhPPژDDP>טPLhnth`hVS\\V\khAhh,tԀ88ȀJhJGӶh>bFbprnztq~pgwlztqV\stttYz˜PDhVz~~tnentQt^h}qxjbhzz}h\k\nst\h{u}h\zYtPPŘ\A\n_tVh_VtnthYkhhSqhhPPа\2\_nz\JӼhDbDPph~ixhVtbh΀(Pΰ\/hǤVbtwƘ8>h#P€.JŞtZh~FbžP%J§V-PհPDԌP:Pt\TtȀ)PԘP,tǤkbePDĿ88˜bIYȘ8&tԤP)hŤbRhP8Ԁ,DhD\tP\ژ82߶\2Pz\Pˀ/Dϰ\)hͰh_etV2hژ82Ԍ\GPtP\Ұ\9hh8PP8hAYbntctPPԘD>\,h\\}iDPް8,ԘhPMtPMȀ,PP\h/hԘPDzkq|nb}h\bb\\tYhtz\>h_hhrtPhwhfnDbϘD>ٰPPkYVPhAzh\t}hAtP2߰VNhstF\ӶP!hȀ>Pteh/PΘPMzbt{hWZ\\hbz\tDttwqrzbh2tǰhXhPM\&hܼhAPPJh)b˘P;thMth8tǰ\5tnPhVP\Gp_hJhP\~knh>hh/hǞ^nVe.hǼhKho{wPhPbttqw}tSzDbP\\tnh>h,Dˌh_YSMh/Pž\ChȀGPzhN\KnG\XhhYhXhknt}wqqZitSbtptrrPhzbnuthnnhzx}wvnZ}\YtbfVYGhVMt\PtbNPPPVPeŰ\>htVbqdtQhttat}MttxnezP\tjpVhNttzVn_†QthPbhhJqtqhzP\kbMtPhohtPA̘GhuthD8Ԁ/hnt~tzPD*hǼ[f^t\DYh¤\>ǰP9tӼh;PðDP̰\,Dݘ8,hΘDPPA8DǼh8t°h0ht^\}bhŰ\>DP\GtwhBt8DYtD8Ǽ88Shǰh)DڤP,bȀEhƤP*hΌ85ӼP8Œ88:P/PDPhbnPDyzqt`P8znhGDP5hnTzȞP/\h;PFb˜P2tPJPDPJhJth/hbtzu8JtVDt>Pbtǰh.JȤtJD>tØ>2¤\P}DJDPte}\>tPtny\TtnJGtȀSMbG\Ƕ88ӼPPtP8¤h/PȘb\>\PhhtwzPPwhhPǘjdPVQh8PԞhPJtǰ8PƘP,tȘ\Vth>h\0\€fktDJP\}hShVPqhntg}ntkabhtwwnbq}nrt_\tnztYqtS\w|\b\Vz~~bhhSt]n}hJn`zhMn\>İn_cDJ}h_tzxhG\tvtzzbShtFhuthtJ>hwz{P\xV\nnedXnVtİ\8PװhTec8Ǽb8PԀYbnD\Șnhthztk\Nä\tSVhΆPUPhPPͼ>8hFPh2ǿvPDژVUthDPΘV}hh\PDǶ\PΌYDDߘPEMtP8μD,t΀;D\8мz\MΘ\Tnh8hȀDzbkcbhPPӰDPȘV2P݌>Ahǰ8PȘu_;zٶ\th>ǰnDDԌK_\hȀ8\/hh@PhDİoht^ZnAhMhSV_fVbט(PԤP-hh6JȀ&PĿtPPh@P\Aǰ\P˘bSMeVYӶP2Ȁ;8߰D8h˰P,ʼV5ӘP8hȀ8DŘVhbGP€VGtȀ5hȘ\8PԀ8Jͼh)h˜tPPhDP̰PDΤP>ϰhD>h5JҤ8P˰hF;h\2hΘ88ĶhWhh@bϘ88ǰ\PŘhPAӼ\hnPBh΀5b̰P5̰\DPј8PѰP5ǼNthIhɘD>żh8İP>tȀ3PͰDD\G\€8PԘ8Jʰ\JnPPưh5h˘8P˜b>JѰP2hȀ*hhVVzhGhȀ4h˜PPnDPΘD>ǼP8V?h΀8DӤ8Jˤ\Pt\Pt5tȌDPkFPҤD8h8\HbŘPAӰDDǰhJhMt€2b˘DPtPGͶ\5h΀,tnPPh;hǶPDVVb>P͘>\nPPh>P΀1ht\ZttJ\h>zAovpthHt€>zVGhPBtP8hhptShPPhDp_hPPưPPPJPMǰ>P`tslJhVt\Sz\IhȀ;hhDhbJh\DttfqqpPbhJP\hPVǰPPGMk\bPhnh~hPPHDMhVhhf\MhVnhMhhtZt\VtShh?hÌG\hPnKbXnRVft\PShhqPPhVhPhtVYP\tThwhnGtnhqPPD\V\MthJ\KqbWtVelwqw\JtAt\AtSEbVzPJǤ\JKhtjztt\GhƘ8PDJǰh>PȀP\Sz\hh}qrhfwhhAbMePhMqwtnzhkzzbZthZt}\Ahtkzvnruththht\t\bsth^thttrzbhrzRPb_ttk\Mb\\Y}}\AhnPNzl}DDѤP<\PDPbhit\PtPP\Phhlbtnhpzvsbe\Sn\Prtzndtzw\VtttozbhJt\hhhvvyh\}nch_tkzGPhKhWEhtR\hntQqh_e\bhVkUhyynn\tn\qYthbq~tm}tznwqqktznthpktztqdfzvxtqwzz}tncnzw~tq{t_znt~v}zt_bt`nhYSqtnu}hXttnl\VhhhYtbtVJkwvziwPP\tVVkhkh\Shd}PJ\hKbt\\{PJhVYhJlputlDJhtPDthS\hh_n~nKhtVbP\]tnVhhPh\DPbh\PjenPDnqnDJDPhMM\}vn9PzhP\D\YhtG\hnPhtVStP\ihMh\Tnts˜P8hlm_heznbhJhan8JΞVGhP\}nWt\DhwSPzPPDP\e}}\PzkZt_hQhnYTtYhtbV>bhkhkqthwfVVnnq¤\5hǼJh}tPhPb\Pe~htDJȌPPbMhPPt}hbz|\hhlt|r}|qDPŒihThh}@hhbPMzzVPVHh\hh\RePAhŒQzhezVPthhSt\\kU\hPPhngde_vnhkhahtbknehhthnhhVPp}hetXbnntfptnTtrV\nlbhqtfwjzuqnzwqnzek\hnhzwnt}{zzwwzkth[hthnkqzhqhb_znVhnltTt`_tVh\hnhPJtn@PhTVz\bhn\btTithw\PP\PbVJtZhqPbh\h_tVh\hhXhhOhtnzhDΘP8bPhGh@P\PhbVbwtr}_tztz{}}vUht\hyknztme\_ohZnothtn]nz}\8h\ztc`˜PPhDPаPDtŌ3hhD\SetVPh_hbtwnt~DPtebhpVGPDDbn_zhIh|ttj_\t>hˤP2hȀ8h\8t˜hYez\\h,tǶ>hPC\nnwvw}nSb_hVkeehh€8JtWztPMŒP\nb}VA\˘PeVPtSNth\ht;hbMhtAPȘPMØPPSPG\hhhnShtw}hbtbtnVtnbznRh_btdhVPtwthhhbzu}~qznz\\t]hhbt\bhNnVtJhVeYnbntw}netzptxwu}jz\bkzn_hVznoztVbthbthbx|sibeztzn\zpzthwptetbq`tqhV}\tnpltgRbw{h\hXbxehtthR\hP˜\hzxtVKzthtaznz\Y8PȀPzuhP\ƤPPhbtt\hDhǘGttn\e€2ؘ[ztehYbǰPPPtmhT}hmtѰ8PǰjzhPP8h&΀hzhbG\hGt|tdGt΀&hӰPDtbDJ\hh\wphh_tǰPPtqtxhDPŘRtPDǰ\8hhMȀDPY\h,hvmqt\b9hh2Pϰ\hy~wVtŘPezhZh2hh\YqPDÀ4PјPPhVhDDYtD\ȀP8h\txyz}nekYȀ6hhtq}qJPnPAt_hA\jttV\D\n\tPh9bhJtanPhVGhzwhPŌPMhn\z_QboQthGtӰPDhȀhhthYhbhThhMØPDǘ\Knhnrtetb_zˌFP\VthhMhh>rteh[hPPh\bP>hDDаP2hԌ8>Ȍ>>Ǽ\/tȀ88Ȁ>D˰P8hϰP/hŤP>V<\ʰP8ɤh>J˰h8PѼh.PPDȌ\FPǼ>\nXqSPPDVYnX\\Shbt\PzJz{bzhKh>Pưh;tǼDDǰhPGthYzhRt\Pzben_\ht}vbTzt~tez_PznqV\hG\tVhSbtPYžhDehwinb\zbtntwqt|qxkmzzz}t}wbhhqnhfzaeqzzqrtq\hk\tbYh^hwxhWbitp}}zhb}_nhPhtfbqbPhž\Dt~znen]tztqtVthznNbq|}tePPPPVVPJthPhhGhSGhhbtk\zhYn^nhFb_b}he}het\tqgtt_\PPPbhzphkte]tsjzzwmzhP\\NtbSttJPhDhYVzPJGPhP\PJhJb˘P>hnhnk\ttdznh\\}te\b\PptskqhQh\tcqz\ZDP]z\Vt9hFhhPhPM\znkwjqnfwo}wntctrtznqnPt|tcqVP\XhFP^zh_xybRht_pwYnm}tVwzbzMhPij\tPJnzq}tetwqVat}\[tbtqhbtLtzhbenYht\nHhJPnxt`zhP}b\hPP\PPnVb\hhVnezhhhPhhSYttzkrttVVrbehVh_TzhJzhEhket€>Pt_RhhDt\Phnh\znb_Rtpdzzshhq~hthVtzn_thKthYznt}qy|qqttn\nw\Vt\hh^nqdnnY\z}{zhqklz\nndilwx_nhz}tqvz[tv^hxtzmt}zv~v\hhPtjRblhHhkRhtb|q{tnkjtzznYzvVh^\zr}bqt\Yh\h\Ptnw~nnqwrhc}t\hwkthb_nDPVVttqwwte^bhz\=\YhJMt˜PbYMbŞhDJԘPGPİhNt>>€:P\JtVh}~heVJzhe\SttkhQbn{hYhShtqeezhbhbhgzt\QbPbP8t\Sn_\tcnntwjhn_hPPhVPJVAtPDĶ\GhVMtwlrkPhȘ\IbhUZhehnzvhbznJhȌDPhl}nkhhh_\Pt_bg}tcnthbhhtw~|h\zPMh\ahqqt\bbth\ttkhZz~{pqw|g~zynwtp}bqqxyxtqnkznwnqywzzrzaqkbonqozVVDPtq}mhthJhhhtzwbhhnVhtXb_hYbq\\nYtDP˜b@bXNh\PPJnV\~wwhhvlwzh_tt\hbP\n]zzkqVPhGhSPhThPMP\_hk\zoxhn\\hYzkthMhIhtrt}PMzhPzktz{bYztlttzqrzttzythtzqbhh\t`t_tezwtthYzh\thSpjtXnP\htbbhzvptthtwtit\qqzb\hPt^hhbibncnqrt}hnkzvtgqwqthhhYz\thVmzthtzbtntwtStzyDPynTbwqtRhh\zhhnbtt^btnVJzh\tnebYt}nktwpwt`tizkdttwqwhbzdttmtwnt_Ph`t_ztwvzzppetrtzv}tSVRhn]z\tbet[znn|nat}ktnPhȀ;PcWhthYtqqthYqwhhnU\htdbtbShPhnYtn}zh\tRtnefzkJb˶h;th^btVhzhKPkgh>Pǰ\>zPJhPPDJhGtnW\hhTbȘPPnSzbYPP\hnRhncntVVhVhMhtqbYt\hhDMǰKhhT\ShbYt^n^h\Th\\hIbrwbh}|hhtt}wnzztt_[ntht\znthhethZbzkntnzjn}jw}pnlxf}ttv}xxkYth\nV\hNtPP\YtbNhzzwpk}tlwzv}ztnklxwwqzjqwtzyzt\Yttlzwwrwzwytjgtmtwx~{{nhtht\ZzhNPPb_thVtztzzpw}nttl}vqwkbru}tkzhh>\hI\h_tqhMhkqtYzPGtYztPP\Stndlzhntht~nqmyymt|y}qozwlzrrwknywjztnzt}}ywzr}wqzznxwqs}|{zwtt}tdtoztanntwhn~zktPh_hhct{qztc]qkZn|zxqzbbxw}}fth\\bz~zptYh\Pwttht\\YtPen^hhh\VtVMnVbtPbtPez\hn_zV\\etnP\bzv_nDhVMt_\tP\\Pent\b€JehPtw|hVPhV_nKbŒDPtetbJt@Pn\tPPtbhnwlz|hw}tn}wb\^tte}hq\~z}qnwnYtXq_ZnhhPJt^ewttwndzzwhVDtnJVȘPDtȞPPDPϰhbth\h\qwh_DP\GјPA\΀;\ΤPDJ\zPPİYMhhPhȀ3\Ű9bnPDtǼh8PŌD\ȘPPztStc}nan\YPhtVPPh?hP>tȀDJP8hh2hV/\Ȁ8DȘ\BhG\PMhưh\ePPTYhh\h\zpzh`zkhThPPİnAP\tbR\u\Pt\etb_Xt\\ntwntoz}nt{yqkwzbSh\\P\^hSV\\SPnStVP\VhSbflzJth\hPtXhprzhbtthhYhEbˤ\9\ekVTtw^\znhnbtVGeJbSMthdtywqttJ\tfk^bzynnut}j}hShhPJfzt}nq_bttt\Qh\SthhtZtVVzhqVbtfnftt{t}twto}~|nkzoz}|xhe\btyhhvtwjhxqlwzntnVbh\z}nftbhhhuzvdnntthtzklwtzkbn\hhznbncn[tht{}wnrzqt_htht~vsslnqnhwrtehhjbnptxz}wkhtt`}ntnsv{oztj}dtwuzto}nq|tq}t]tytqtzxxyzqnnzzwt}zpn}tkt}yr}xvztttwxyxwzwrtttx|qwxt~z~yzzz~|}wsn}tnzvvytntyv{wx}ysw}ntwtnq|}}zyx}u{y}}wqtq|x|s}ytmkkzvwxknvo|wn}phbnnlwtgttcqVektt}}z~tYtdbz\`nthnhGhqwnq~tbkthqtw{jSb_Mtc]znknWh\DtnSzosv\htV\Shwh_SMPPPHPD;P\KttMhVPVtt\hPPnMtn^Zh\Dh8PŒh^btPh>\ȌYhzdnȘ>8Ӽ\,\Ȍ\K\bSth;tŘ\C\qfqVGhVPnl_tk\bb\t__tD\ΘP8hȌb\hPDǰh6hȀPMnntV\fltzW\Pthk}dzJt8Ph;ǰhGMV\xP\GhP\YbtPVwjhzbhtSekWtat\PnhhzPPhFh_Yhet_tntwiVhtX\nrhDPtMbnYhP\h@PlhHh˞\Pnx}zn`thhq\VtSh`qtwy}kbtzeahh_znnh~vkn}hewkh}tqzsutl~ozh_tezwrzx~zvwvmwrt~utr|qhnx}twkttkrwq~wqxtx}{qorzx}|{|ytw{ltzw}ttvtzxqkvr}zoztwzwz~z{|wxwxtotwzzns~tt}|wzqztwwu}zwvxz}tvzyx}tktuxyut}xyyzu|w}nrtozot~z~vw|{xzzz{ty~~}ywzpptzzstt|ztszy}~|zv}tztrwuzwx|{}}|}zzzntzqzwz|tv|}zqw}~|wlzzw~}zz{}{z}y{}}yzz{~~zuz}yw~zz{vz||}}wwy|z}wv}z{zx|v~{{}}{yx}snzzz}hhzz|zu{}zz}z~qvzx|zxvptw}|}{}}}~zz~}}{z{|tu{}}xwqq{{v{wuqt|zzpw{{zyztxz~{ztzzsswputt}uwwswqwwtn}x~{{x|w}}}zxzv~}}{y}w{zu|z~tqwzzswtpzpt|wpnnn|uzvkrnnuz~wwpjzwx|yx}wxzkklzz}wytqu}yztntzv~wz}{~}zvp}xzzz}~~zzqtztwzxz}~zv~}}~~}~zx|xz{}zz|}~~}}}z}}}~}}~|{}}}~}|~~tmp9balx013/distribution/innosetup/progoptions.jpg0000644000175000017500000006162113616566001022564 0ustar carstencarstenJFIF``Created with GIMPC    !'"#%%%),($+!$%$C   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ t?Ws[}_=irG77Wt>f6~}CיG"Q4{ba^ݣ%}kh[U_lg3|ݙWNsԲ77]|`gB>kVd}Ww,Uz#0(\c0,^r`Ch,~u/GП` d  |>خ2d2dFL =V0 !A `0` <ݶl(5͢VRL2`<9ݺ<#v'Jh nbY;[p2P@ #)CskP#)Csk&FO8yD0L"$ L*(6J Jkken]t·ZņLE^Pt!D5VaV܅RC Ax+,Jkken]ل#%ysewdFNlO]iKvJQ-i$ A8|F H6 K0{\w+vڮķA #NY-DTmC\ؖ Y jdIha6V]Xɰ1,ms̭k0B1,s̭koG2'x"TQ:avV݈JB+ HZ[p%ysewf%ysewfr %eHHp6VZ6aF3D+0mPɺv@ OkoY]DN@7޲Q a9[Wi=lO<ɪl)$FPɃX0Df0ms}+H姏-rt-sz"i‚F Օ%RDV]j@# D6V괙&.7޲A"y(x\W'z15btK3ٺɃrw](2\d>7ޝw @Ƀ2w]$I](//7!H%J."L7NY`Lo:VZTl**+/,$dJM%&Ydy;Ӯddy;Ӯ{cx("%6 2d$Dms} .bveqg,ˠ7}++eMVFE~ڇˌ-cqg+~&̯R8,1OolnlnlmlmlllllOktOktOktllmlmlnlnlolOod`Z8_#9NSNSN59NS8Sx39NSS//ٿS@E8-/!h^8,e;79'~e} sXyi~`Z4}rMx2ڳpqM\_3/ٿϿ 3H-Cv 2p3QBnRjgN70rCWܥCz{!Ը^ [rC/p(-cV3/ٿ`[x9N3my'bd`À%Hf$NSxejJ2fXli+)r.)VQu/)0"Pf_'Z[4}0X.̿Og8\u2=r|@ʤfvڳX硵Ll7.Qx Y~!U00MazZ70[ {`e4+pT:/ LG۰PLb7mq1}-^_u2~#xIdc9$g(ҝ3# &Oxz+曚ni曚niW [snm͹6ۛpGOOx4SAM4SAM4SAM4SAM4SAM4SAM4SAM4SAM4S'ʛ̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̛̗vW23PQRq!1"@A0a #2?hlg,6  Qv>eM Q#4t?^TֈMh6?{w/hutK͉Z /`|C{={A,>a6#zތ MW`=`^HM绣x_k wQ,'Ou=($'(F=|ڋ͝(G"FT#ge=ӢZ,ޥ"ohOšoџ=a5 XdMB"jPȚD,2&a5 XdMB"jPȚD,2&a5 XdMB"jPȚD,2&a5 XdMB"jPȚD,2&a5 Qo*^xw)zMds)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zMdsܥ7rG?]^xw)zM#/Idsܥ7Hw8|9C[C~&19Z~~&Bj)e#Kow)zM#/Idsܥ7~&r29RG?]^xܥ7??v~&r29R`w*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qw*qi_-3PQR!1A "2@aq#?3+⿠G? X#Ez*$$`}y9R>}. jV1*w21;<r+dnފQ$cE^USd*L+y_@Fw0DDV/{7wVn mG6+ E-ԒDwj5z}M* ; 6l3g#aF̖S϶:idL?18j`߿0Dگk묨8%e&ZBⰝ{3o7V(zxW;/xzz3)_b-E٭ԥ|MK앑+`JfbÈk5U\"LhM2Mm6\q\jVĠsT]Ų(鏕TTӬyeW:to+6-MU@}9*r¨Ej`ژak O)U[].al5i`.^ƞy)Vr4 vJiV$ƩFBV2&|HSV齥6$vp4N>ھ?{׃Q9ھ?{/xzd# P0{ˢW.U)LbMʛ >'XC0%Goʕp1oXظl{EZc[nQ5p4Nj򙳉Fʳ McMu@ë+zDN,aFģTr˨nL%g,ƞ?{x8'tEX:򚴰;R E'zTD6ۘ* \\j8M;r><~ "^KE6]Dڷ_kVtOfi8Ͳ8U)ٞr7Fg SS dD\ 4_xi+R#bp1f![:.j{)c{Uq{ߘgBmr=ڜj)G9\USaM,T陕հA?cYt7 lH{\JmEN Z?{eܩv؞?{x8'tEXIrW[ʃE>S X@ D8Q|]3 bөO'ZXj/4 Wsiv^HRDVmoY =«U Ejlq|b7`SEf  6RפF1`cV ůÁwDN/dK.+a%\iVխp2LDPel{y=5d[bȋJAJAIӦUǪQrJЋ;b2\J=ϔ/? MF-*`\##BY;&Pa o=x9-3Sp7^{ZƥI1QLtA*S[[5 Jr4!=[\km(QvoÀE: hj5-劊0SH%J%2Ǽ\2We-~*e$KMg):x8^.}<~/tD^ Vsp=b4]\YO.Sٴ}Q bꊪ鈵/EzR,F,B?pEύv^Pckeylqf \^ ŸV#[)%^/M uΘŹgKQw j2plTF}6Z8/͔Z`&>0<^=3/(, =bW[혅`BL\ 6T4TvƜX־W /tDXA ]qa7')smST k')I[\'nʝN)o%|X _?7ÀzE?7ÀzEY䯔Ub͈_g%(>50@VL i:v¼b\j/C<\MsڗZxEƳs/j\} ƍDhJB[#1s.1{ "Y*#IOg ₯OI]H "w^vE`>ؿhdTaˣv) Qp\# |[7iz"{{$vJhn-3vɇŌzEBSe9rƸwdb224u~mo8z&,8m9XjX˾0 !O4),#GK\fe,+iEy6OARS~iD5CW/l|O>{'xzM:u :}4KoO>{'xzO>{e)SsMϿ7>n})SsMϿ7>n})SsMϿ7>n})SsMϿ7>f-nn?Hot(YS|L%;!8|et-S*n<ب5KXj-G0֦2A_H>P 1זB{U:6b4^C/bx8^i4ŲXqR.-l0P^مaaEQNu-?|x^pzDfoj7Yڿ_f3{WfXKUfo*7Yʿ_f3yW=gzEi4M&Ii4M&Ii4M&Ii4M&I o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9o9ro?*!1QAaq0@ P?!-4Nƅ0/h/h/h/h/h/h/h) բ ` (AR^sֆm%ȊYiJz O5C_  4ʗPx0a=Op~?S'{=On~?Sߟg{#=Of~?Sߟ{=Ob~?S{=C ӻ~qq88?v&$s<hR"z8J㑊5 l^n p%gDo#th! *@*g<Xk!W3h#UjHj&{ 1,;M@C#JsUn?nǰS8|>fD6۱'>.L3rEE*00Wj%Ul84 HA嚉 iC04T ˑN T?/uίĆY `Do3(AXv  PJH [y\X)"ILTxC CtTqrB&ZF5m!aQ!\V(xV-22>7v= (Q2 Q/-&NEF"vC\ gI%@i % 3+C(@@pj΄hJ +Y`LxXk"Ztl}xIJ)5d8uzHE1X,6YjJ59[$Eoy:&uf#=ݏa@ k v݄> .c=!ongLSy5T,d zYiIғJ㡄45b  "t\N36Fn}NЌ $ԎĭC/]a<'R {K  @4'>Uvb*wB]IKGA܂6`B!/e x(*X CLRi$t]!:DT9$%:< ފ͢?Vr)պ2MD BH~,}xY@#vb/<#tȪdT<ı ƪE huKL…„ A(XEk_=\哰 EZ7&Q'JAl  `&xZDohB  ,hS ;1qsKapFrA!]uEΑpƄLd (M9FԱo$ 0":Gc HcRG0P&5E40#||=byLO'`N~ /VӇu%zO{b5`?ֵkZֵkZֵkZֵh D6}~:f1cf1cg2#Dc"1Ȍd|=1TSzoM7=܈ #1 {11110*p_byL~C[q07' \+0ÕoFV $P%@0:VlO;k:АMp?s':z a\Ґ⁀ 0n&REP9CAqfY?qMYߑqr*\!(1qã.byL~A)`Xyy!CHi !4!?bÒI$I$I$I$Pv {\sk={\sk={\sk={\sk={\Јg >RI$I$I$IJK!\ V=P*8v#pV,d]re-K%KdH$I~@ 5 #"H2I- :~I"l ;0ammqmmmm&ܛii&;mmmq<?26wY&&{aϚ'_?)mmma<?f$kmmaXemm[5mmmu|{ $Im0T mmmlwmmmmp`m`$I$WH-ymmmmwemmm8%mml6I$I$I$5d6lYm%*mmI&II$I$I$R6mmMO-\Ho%mmiMmmmoiiIm뷣Ww\omm6mmmmmommmI&I$ommmmI$It/mi4ImRmm)$Hommmmmmmmn*!1AQP@a 0q?j<#?#?z2(#$eVxhS7xeBIN ĽI;3#Oέ28R,ed%iW&I&k9NFI7JV+ќcGmMTWJsUG&nRm˚֙S1-SHƸWEuLMQIFEHq"I<)3kI6Prc!K(֞$-y{ôk9l8 X%Om4u\DVXkq:a أoɉPI7"I/%67.XBqy?I$2G2lNb-$m/dBnMtO)l!R9Mg(a])M8ƔI+{Q4mi>Ixsc "s1l&Ъ(zUlHK"e;5S!~" J.CI=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=C=CblA` 8Mc4]$II$4]a8MX#Y&Y&Y&6G vG vG vG vG vG $ #v; #XY&}4C$ # }4Cz+#g4Cϥh>edr!=n},SD>edr!++#YY}4C$YYcs~'OӟK+#㬇`#A}:GLYYd<;},'K1x?YK+#㬇ho>VGYد{JϥCðg!?_K+#㬇Kg!>:xv YYeҥJ*TRJ*TRJ*TRJ*TYYe쬏ŀed|u`],,K+#㬾"B!DuB!DAld$I$I$I$I$I$I$I$I$$ {70E.>; <6 7BgfDH]$BlY= a }r ޟ'!yd K}"M пdĀ2́~(nNFw릞!$kDHoCdZds`nA>͸Hp̮=Ayr ڳ?| 1h6H9]4G G8ݸAr0:D fG_  |$~Ze\ZXۣ}ߔDVN%3:C)ytINUuUW[]nUuUW[]nUuUW[]nUuUW[]nUuUW[]nUuUW[]nUuUW[]nUuUW[]nUuUhte:tӧN:%]r䫣82dɓ{vL6 Wp\pe ?%\CK 9rU.J2b%\CK إW{*c%\CMWPR䫃(v)rU;*,˒ 9rU;*\pg˒ 9rU]?%\CK إWPC%\Ct\pe 7鄹*{K :a.J2b%\CT{&4 H QS現%\CU l/}CG.J2\pe {*)rU5A:\pe {*)rUsdY,K,eW{*Ϩ=#N:t.J3H䫃>>L%W}WN:tӧӧN:t%\rEPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPl a*!1AQaq 0@P?tXra3_=p,).z^*Y1g1g1g1g1g1g1gp: =@5|Bf&}V:wJ; 'B~KY/l.GuC/Ugϟ>|B=C DjPW/Yc`8 En<%G)A0J()ÜgDH /H1ྡྷ'Tn<9A+z}q>G`s|B)о/3 #Ǜ|Tm^f| r@'7PN:$tG%4:s_l /8qO]#>5CˆFڰ]W^ {кV>42 2<2D%^l&?@:Jξz4'yW"#ȀOHw<,QIeT֜('i$wvh$& p:C j4kY8bUF%O -< Yf5.20M>e;Cv9a^aԡHǓQ6'LRUUڸXy5{GS*,2 Xyѡh˷.84hÇn]1jX0bBl=~y{># 0d>n\pÅ˗._{^̃i1 ݷ5?_z/=?z+Dʰ{:QtHeXW ^6hQ4Cl te4Uw+@T3ͧ0ctӁ(Ĭ`aIKci棖 g&͒- @m3SY# }Z98mu93\"䥏2Nb#H umq:Bƴu"vrz~WAnȓ, RNl!-_,5%\ ,N73Jv .>x  Nzχq p$}Z~@ڃ0 ?i0C88Hޔ9`Jtc.ܪr˗.\r˗.\r˗.\rqя(`Q"b\[N㌪L-X6Mɖ&D)0HMJ0LDi趆+*THeN;BJIq=лX [:85t(lMlb e#!7_l"\Qh.Όd@Bq@]\⺳QP]T^.a㔜%1: :ׇ*L|Aսލ Hc v`I KK10 34@A˗.lq: DxrA@O /(W=F4JӸb A?`9ЫzڂphAMvĤC ^;EB-m4hrj7J :j-W\}|٬:4* L8Ԝ>sk滽:ެU]MZ7kX#qm!w`褈 Q,‘ Jg"|U~~W\koq7jW$m55 @x{bdYkJߓ*o0xYDJ6Oxޓ#t p^2_ zńWGq .оB )w4;bwmFү9rn+Nq<(Σ9qL nKa:=g-,te˗.\r˗.\rˋ>6^F.Q gNE<1g* 1jk3X[3C< QZ&I@!2Uz2/d@<0.թm: >yؗS{xʄ+֩fr˗.\r˗.\qa߆޳.QsYr˗.\r˗.\r˗.\rLJ~?S.0;PDT_qa_Y:A7 +\K(J#Y!ǃxDˌ9)76B^4/-5✖j˗L6²m_,r˗.\r˗ރ3d5WCBwzU@Ѝ,B AHiPIiaCcjǸVER3@풀&Bؕx(Th| 6^țXI(IhqtӞXtkh!sHV ށxw$غXCDr˗.\rǿ;v` Qhm4~a\r˗.\r˗.\r˗.\sы0r˗.\r˗.\r˗.\r˗.?;zRD' '+~R" %3ܘظ"!BS&1N8n6q΢aӖQCLSHP:*ZX/Jq9m:M1߲pe@Mͭ]R]Cp(O9`i:īe^<`&ADsiȫpj;A+D]iG h{v3c7?L .\qf~N,Et`^rtD,‚Zj )6v!(hkcrs dU- +x‹o CC\N #^P Owos|4Ae%sTY7 * .KG! Jx)4f.#@y\N~DƙCITW 20jI2 pL#JqMe˗.\zӏGa+U/(A\ .\r˗.\r˗.\= 7Ӄ e˗.\q9n<F0&\r˗.\r˗.\r˗.\r7?:qd("CH$8a/剦p-tT _j"¦Hl<gaIto6 vk5BLlwN(Өk.\r˗.\r˗.\rr~N<6Uϖ;1Kz:^+ćE,aڬ4SRhORZOW5rF!& jr˗.\r˗.\r˗.?gozq H, 2˗.\r˗.\r˗.\r˗7Iz8yGG C_ S.\r˗.\r˗.\r˗.\NOň'ဝ:429Dɭk8V'!wPrpCRM1w/I@tJ8 O9y|{RdR̈́!{92$uIWs4]|o|kB&Y:NwĀYSQ- k[J4<4L:81nbS[x(O,`u&@.K1cwKyIQd5:4^3z%ya^ s{yGai7'sFQ޷+اM7~0:'D]plkc턾/0=y: DƩPbx✣|Hj}.K%EvsU严CSgsv;m=uh7 Y NG} ]ANJTv1o;s9քf!SSuFBΩϜ9+@ȍ y{~=gn3 W0-%]rɎ K4|>-LP*Mq"PTwff2¢ڍd g; HXٱ.=ݘB4PN5Mq~>>>O[ MqaVhiZGJoN"-'AKVyR]l"##7U`[FA OnUCkn1ylJݰ">xįr`!s'\Q%4Y=3 װ"2);|@=o!)*,v }Hp/4V7wGp0+?y{?=o|-:~K~Sď"$A' 7pq[jJnώl ޝ3|`JTNTIf V2ǔBkw oɁ VSZz5E fмw7DJ`czjڎMAfٻL`0ڪr!Pz`M:/WJcu&.ȧGamxt=)~xӭʢ1`h5<\iCi> ΣYCL-kR";WnS]6~Thvpd^R)h!tG#4*=]81>ښВBm{gx%8H\ʒ /9AH?'.ݗat,S,U;i`lwj@88Q:}qo06SL妣%da7 $-;PSDbDp'Eu ]2wX kZ1 DjfC`Ў tR?\HUڃ0ˢX_PHs=:Jϐ9N}'>IϤs9N}'>IϤs9N}'>IϬs9}g>Ykk*V> =o9'}>c?g3#kewewewewewewg>k++5y|>}3g<Ͼy|)߃|@z, lnzdC`w kjDŽ2"Z7&5PN[M׋@ 4(<꧜/6|dFHaӥq1 #9ƘC>l%/ҟ|$G y ®i )0!T;g?,LCH^[ bpBeYX<(ځ4Ӗ-3׆s |@zpY7v~ݿy߼o{=;;8$O{=|~?y9Zv3ЙL&z= Bg3ЙL&z= Bg3ЙL&z= Bg3ЙL&z= Bg3Иz'=D~?y蟼Oz'=D~?y蟼Oz'=D~?y蟼Oz'=D~?y蟼Oz'=9W?tmp9balx013/distribution/innosetup/ponyprog.iss0000644000175000017500000001240713616566001022072 0ustar carstencarsten; PonyProg setup script. ; Copyright by Claudio Lanconelli 1999-2019 [Setup] AppName={#APPNAME} AppPublisher=LancOS AppPublisherURL=http://www.LancOS.com/ AppUpdatesURL=https://github.com/lancos/ponyprog/releases AppVersion={#APPVERSION} AppVerName={#APPNAME} {#APPVERSION} AppCopyright={#APPCOPYRIGHT} DefaultDirName={pf}\{#APPNAME} DefaultGroupName={#APPNAME} Compression=lzma2/max SolidCompression=yes LicenseFile=license.txt ChangesAssociations=yes PrivilegesRequired=admin ;run in 32bit mode only due to dlportio.sys (no more true with inpout32.dll) ;ArchitecturesAllowed=x86 OutputBaseFilename={#APPNAME}-{#APPVERSION}-setup RestartIfNeededByRun=yes ;AlwaysRestart=yes MinVersion=5.0 [Files] Source: "{#APPNAME}.exe"; DestDir: "{app}" Source: "*.dll"; DestDir: "{app}" Source: "audio\*"; DestDir: "{app}\audio" Source: "bearer\*"; DestDir: "{app}\bearer" Source: "iconengines\*"; DestDir: "{app}\iconengines" Source: "imageformats\*"; DestDir: "{app}\imageformats" Source: "mediaservice\*"; DestDir: "{app}\mediaservice" Source: "platforms\*"; DestDir: "{app}\platforms" Source: "playlistformats\*"; DestDir: "{app}\playlistformats" Source: "printsupport\*"; DestDir: "{app}\printsupport" Source: "translations\*"; DestDir: "{app}\translations" Source: "lang\*"; DestDir: "{app}\lang" ;Source: "{#APPNAME}.ini"; DestDir: "{app}"; Permissions: users-modify Source: "{#APPNAME}.html"; DestDir: "{app}" Source: "oksound.wav"; DestDir: "{app}" Source: "*.jpg"; DestDir: "{app}" Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme Source: "PonyProg.url"; DestDir: "{app}" Source: "installdriver.exe"; DestDir: "{app}" Source: "inpout32.dll"; DestDir: "{app}" ;Source: "INPOUT32.DLL"; DestDir: "{sys}"; Flags: sharedfile promptifolder Source: "wdi-simple-64.exe"; DestDir: "{app}"; Flags: replacesameversion promptifolder; Source: "wdi-simple-32.exe"; DestDir: "{app}"; Flags: replacesameversion promptifolder; [UninstallDelete] Type: files; Name: "{app}\bogomips.out" [Icons] Name: "{group}\PonyProg"; Filename: "{app}\{#APPNAME}.exe"; WorkingDir: "{app}" Name: "{group}\Visit LancOS PonyProg Web Site"; Filename: "{app}\PonyProg.url" [Run] Filename: "{app}\installdriver.exe"; Parameters: "install"; StatusMsg: "Installing legacy COM and LPT I/O driver..." ; call wdi-simple ; ; -n, --name set the device name ; -f, --inf set the inf name ; -m, --manufacturer set the manufacturer name ; -v, --vid set the vendor ID (VID) ; -p, --pid set the product ID (PID) ; -i, --iid set the interface ID (MI) ; -t, --type set the driver to install ; (0=WinUSB, 1=libusb0, 2=libusbK, 3=usbser, 4=custom) ; -d, --dest set the extraction directory ; -x, --extract extract files only (don't install) ; -c, --cert install certificate from the ; embedded user files as a trusted publisher ; --stealth-cert installs certificate above without prompting ; -s, --silent silent mode ; -b, --progressbar=[HWND] display a progress bar during install ; an optional HWND can be specified ; -o, --timeout set timeout (in ms) to wait for any ; pending installations ; -l, --log set log level (0=debug, 4=none) ; -h, --help display usage ; Filename: "{app}\wdi-simple-64.exe"; Flags: "runhidden"; Parameters: " --name PonyProgFT --manufacturer ""Eurek srl"" --vid 0x0403 --pid 0x6e38 --progressbar={wizardhwnd} --timeout 120000"; StatusMsg: "Installing PonyProgFT 64bit USB driver (this may take several seconds) ..."; Check: IsWin64 Filename: "{app}\wdi-simple-32.exe"; Flags: "runhidden"; Parameters: " --name PonyProgFT --manufacturer ""Eurek srl"" --vid 0x0403 --pid 0x6e38 --progressbar={wizardhwnd} --timeout 120000"; StatusMsg: "Installing PonyProgFT 32bit USB driver (this may take several seconds) ..."; Check: not IsWin64 [UninstallRun] Filename: "{app}\installdriver.exe"; Parameters: "remove" ;[Registry] ;Root: HKCR; Subkey: ".e2p"; ValueType: string; ValueName: ""; ValueData: "PonyProgFile"; Flags: uninsdeletevalue ;Root: HKCR; Subkey: "PonyProgFile"; ValueType: string; ValueName: ""; ValueData: "PonyProgrammer File"; Flags: uninsdeletekey ;Root: HKCR; Subkey: "PonyProgFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\PONYPROG.EXE,0" ;Root: HKCR; Subkey: "PonyProgFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\PONYPROG.EXE"" ""%1""" ;Root: HKCR; Subkey: ".e2s"; ValueType: string; ValueName: ""; ValueData: "PonyProgScript"; Flags: uninsdeletevalue ;Root: HKCR; Subkey: "PonyProgScript"; ValueType: string; ValueName: ""; ValueData: "PonyProgrammer Script"; Flags: uninsdeletekey ;Root: HKCR; Subkey: "PonyProgScript\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\PONYPROG.EXE,0" ;Root: HKCR; Subkey: "PonyProgScript\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\PONYPROG2000.EXE"" ""%1""" ; "shell\open\command" is the registry key that specifies the program to ; execute when a file of the type is double-clicked in Explorer. The ; surrounding quotes are in the command line so it handles long filenames ; correctly. tmp9balx013/distribution/innosetup/devmissing.jpg0000644000175000017500000002323413616566001022347 0ustar carstencarstenJFIF``Created with GIMPC     #!)!$%'('+.+&.#&'&C   &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&p6 Jܾ=<۲[|y}{ 3sUǠ2[DL;}>%S` |:e@ <ם5畫oϠH$@$  h9=jI$I$t $H  ">*>bI E#1 4I3z'mwUf*-3N . vf;;*-$o6:@$ ˷vmWpG,HQQ&s6mu]_vjAiy<[iRNNMFC"}Z $ 㲣Nml껀W$ͅA[ETځ a9hhȜywyS8-HpAQsmߛgU|w A$6n@&(!#3204 1$cFL&E1eXTjdvX{jBl9D#&L2dɓ&KzRSJT(Tɓ&L2dɓ%W2J͒eq K3EP-{[2YK&L2dɓ&Lf՝nU]S&L2dɓ&L#9Dnꥪ}Dmg(qpppppppppZpZpZpZppppppppppZpZpZpZppppppppqq5TUL2dɓ&L2dɓ&L2d}Ko':Ri~\]SF~Be˪Jv;lۭnw kFL] BWL9u/;w&t^hJ(꒯&tMڳdoooQԥ!h>N&Q!:l}1+mlrZNkB'B#m\xD*NsDPbr#ER4XVMJmTOɓ&L2dɓ&L2dɓ&JJR㼭%36flّ#fF̍2' *#fF̍26dlّ%J4.~6ɑ;L$"#Vɒ4dY2/LE!IRqLK|nQʔ{lFt22E2]"M2mYy2\bLK%)Oeɽ-ytoiGɔJmކ%ZRR)dl,$\Q>W*Aۋ7n,YrDF*Y %4ʐ鸳qfś%8,ś7n,Yqf2K?i&bi&bi(i&bi&cbi&bi& GygygygygygygygygyguX1QR3q! 01@"P2Aa?ˎ/8z08~C1p4ُʍKגa\8Z#E5$œ9sAy0j8Dl1їKQ;D m!E9P*\B˜Ys .reT,ʅ9P*\B˜Ys .reT,ʅP*^BܨY{ /reT,ʅ9P*\B˜Ys .reT,ʅ9P*\B˜Ys 0Ɣ;~t(v7x Pn47LiC8=V/Puz|,^b_ :XA/PuGw16yCX7LiC ^P;~x PpDTSNn9SNn9P}!cJQ=Yw{}g06VjUf5Yef5YVjU˳Ԧ)=FpH nX-I(.öKbq Z۷aUtq,ZTjCL{dåe. b݉/zfHeEbCLTRU8/Y 0x)G>O^[`ibA =ge\u{M7vUFo? ?q (8`(hB50iCXT`CH`_4(]S1`f_XGPB+Ħj/`+j!^f Zc 5 qaZQ +mѬ3lAJx$6(CzBX#+` 5-n%0 2(ֈGt 2%lcYp8dL$S ;> zA)H!T0}!m )T1b KHHk H*U@5=WN_-5WB!*eV $G=Gp$#1d XQ   ` "%̓x/A, A4Ab#"=fs0Jdq\U^?GSɐz{XT|3 VBb+K+BiTLvB iY;TĒ&`e-Mz+n-H4D c|` 4n*B_37 {B(B F;ƀK%,ccJ_8 `'BvY0q88{> L6:Nӯ:Nӯ3 Ӡg vri(vri*8@Q si8vsi8vH L ޠ+{;! "a03ӱom%M 3fKǨrVC C+G? Y8*oOa`Ba?/0OD2 kh ,>a LxqL|4ؼ 2M6. Һ@ (X }GC`h@أ?L%܊kQ @S `+`R`CU)DD2OF} >^#UH!6nfOqhhlSE3P43P|/>/¾'bq':` (jSbY?%GC<MhxtmXICa@ ӶmlYP+|~C8N2qd'8>8)N pP,% pS8)@ _-&Qt~:?Gt~:?Gt~:?Gt~:?Gt~:?t3 >RI$I$I$I$F%mm]mmV:mm- l-K(fi,% iM4M4-mlЌ-K%NmOm]Mk$Ҥe_}} oM$^m_ZI$i$I5mmmm)!1aAQ 0qP@?r&h~53Kߌ1GKDYZۻLGI)d{D_1vFݮG9֥RD tg DzK ي}qG/iøb>u}tfZ I? $1csk`|2"Nƭ PqtlK^ IDE羾l~- TN.ˑ$4^qqqqqqp!r!r!r!rpqqqqqq.54Y;`dZ/d3"ȴ6A2m?h̻O#.X1Xba+ V0kI$I$|$I$I$ Fey3}&Q~4f]8e+\Fey} 70h} 70h}JI$I$HdI$I4f]fafafV/e1t 'Uج"+"+"+"+"+"+"+"+"+!$[>*a!1Aq 0@QP?"&lm?=.sn5z2Mum[Ocm ÌڍCXm ov ոt5$M.et f} 5 j.Z=0H"IϠ{-I$Zg$dfڞ& ܲ6ʌ*u6ʝlͲ6ʌ*3lͲ6ʄ*lM6ʄ*lM6ʄ*lM6ʄ*lM6ʌ*3lͲ6ʌ*u6ʌ*3lͲ]_OotmB=oy 6O!^#eK@ʖ-*ZT hR2e  2dɓ&Mœ&L2dɓp+ѻ[=]{OFGcluv|}B=*])tRKE.]Mœ&Lɓ&L2n;6p X}jv'EoA9%@F9V$?^*R)?Ovڪx \.X%ke٪n5%uIP6l:c9 U*``A \i$@'.\tt)pǍ@AIK* aEq >~*+UMt|TkDdD"C,[ ш %,&`W 'Z4(;]:\`ny(4rku 3.ӂ1SetЮպ8#A @:ʚ;0\1E-q)*D1:fvPUgec[ڠ^ UmFɞeuH*Px-^TGYww&҅-IJLEeLe("鐹\dy1!Ղ @pA%+t;tn (CKX (pdo QZ댺G)Tph \@ʙPv*iԿC“w$4ii\mZ B7ސcqV5N-hMTB*5A#:c ^mXßO u 1! B6P6-7/ԼT x{bb@52դMB*Xՙ غ.*eҖR۠a+AR1J6kwn``*'Q/tU)vG,P@ y*E‚A/VQ ZS&Q(=BqltGCrv EuW@kRBe~RkF(d+^iVMi#&jұ B_ O\J߿~,-@-ZvMN8tE|f!: 0`1 ! DpDU-'uVj*1P,)}2`BըnRO""e[d̔zHˆ^?1|!m_5%`tGNҠ_ AuPhCL5DaP"&9u0(e]&p_ "djgiG lX BUjޅ-oJE'F-![ R@Qqv.Y`űFGVUTDbZ[Cjr:jY ;,H݃o`*)UJ*ⅷ}e\T%-z-LqLd|j HQnEos3a!ȴ\~g3jw0._h,j@ZNeO`;J@tEf^DCSyg>9 $@2gr$[',jg>9ϼ}s3ydݽ!4?vgOP=Bz '@(]WtO@=z 'C@펩s'O@=z cWƔUk9w$z>Feg ,sUaSNJV?ޏ ݙzccXm2Z\pG٪V厩,]{cۢN#ln7+g# 2聿~7G^ڟ򾏑c7KLJսZ\{aixg9q\[g Y94٬:cW|v 2@@``g9N d 2 2 d `0`0 `rj( 220 `+^hr2 @b_Mt}o)ܱ,2`=Wxm[Sz}0b + #j߰'_K}oؙ]@ ^+|^+BYXv0Wf$NM%j߱BqДdAǓ_I}o(ڷzrAA+ZL8I4,Č_}տE9cjjt$#+=Sx'][=VX$"9䳙r2YG:s;C@v%}R:ߡ J(Rb'=ESǶ.* G$AU."ޤ\PR:ߩ9 Jid(.O7/IVOY1QKQ=R:ߡr9 nP$rP,;lp-JddnC;Τp2ÔyzNz챃MUX\dcB`X$L2]R) nRǣK*(WP Q}R:jߡ9 r%@ `<^x'M[=X$SlPK \.^,aĊ=P\(ej8Vi$`S09k-0~IzNg> ҫIzNg> ZY'e,"bI1qfH 3u5jt-R:Auj3/IS=5Gq j6xJMXd8jLɈg%ꜝ1Jޞ1W5*Cq&t&tv[Eǯ1umA5W\D"OKwg1N 8b9z%w&%7gz^w7/IK=q 81&!#DBr) s6*Aku=tkIj͊G^!SNtQL<ởA7 {]l<뒤& <$Kok4D 1?I\^)e x4nqqYrZ^5l{Zr ui+@*3Ԃ-dpji Q'3ǃ qh3f `` !vMaRZb܏ŝ䗤%?c[@M-Koj3&> J-QCZWy%7kOT€U%͘䇢:EFAed ԥFR8e2/fdy'>/& 6TQ'Y*TR دJXN? +FʷKoj3ɵ+ ۉ{JԐD;A"C >րnbBq¿\urLY0)- cH b?/e3oO~y%y /$! C/e3 G/e3 G/e3 G/e3 G/e3 G/e3 G/e3 G/e3 5G︅iY%yۧuEj+QZVEj+QZVEj+QZVEj+QZVEj+QZVEj+QZVEj+QZVEj+QZV{)@v*%, `KX%, `KX%, `KX%, `KX%, `KX%, `KX%, `KX%, `KXm3«`X, `X, `X, `X, `X, `X, `X, `X, ;E덴&@5|L ?"O,ݫ177h\S<<@\*Hf;̩Q~@^<.1/[<MG}i w¢J 6b纙o7WETY VBf 0Y`,f 0Y`,f 0Y`,f 0Y`d+!Y ʋ*+^WsL^WUUVD%,dK"YȖD%,dK"YȖD%,dK"YȖD%,dK"YȖD%,Uz^WU[g`++z:-*:砸$įBȨ"%B}U*P]hlS<?'x\wj}q'i02!!uRq"!{Tj~n eNVtKŦR_7fCßw9:U7榜bu<9(4W:L݃pVN9hĨ`? ;{j:TO/5u4b_FO#AoA?u3U{}G*[4LiVU5) J`i ڿWSs}4:RtZ[t)7c: õn[Vi)6%)&p|R[4LipBj$NKiO>mȫ?u3{U vd܆FV 'aV\$rQ;q2PZ&"1SɲF\uQn)NCrzG`p#@ը 0ZyS>ÅA&qqfF0mpܪ*N6G~3Ѷ o6nU&n !{@vu<Liqm\[Wŵqm\[Wؠl h5k@ցUdju5k@ցZ h5ZZk@ցZ h5hơU39ۭ{/ш8spεQ @2ȹY ٓZ+ۍ}eX1mI`Ɔ-ӝWWRd߅%]]]I)@vW`i Ŭy};5WWO'(ܷk1W>S'M$q^l:WWGri NWWWO{@vqݲq:[wnu|GD)en[Vᕸen[VI )a΍p2 +p2 +pʥrkw +p2 +p2 T ;<ޏkFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіekFZіe(6 34AQR`q!1"2a0@P ?Iz W{AWQzN}%5WE"2"dk= ^mT?\=G @!$_3GdDzP `B ꏴQ~4a#8(0$CW;0%{{D`ex'h2/A0%|jّ}2C/>RL- ˜; dh/|CFI?lRQ6eB'4I3~^Yfʃȿ0ho)d-*33Y 5C > Y܁}P(ŏc"pͬ}F8KKB~#_>]0k3",*1l|>8A%7}oFi $w/B6q|!S?o&FD?b./BMOi%5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(k C\HJBP5Ą$% q!(kMQhZJҮQhZJҮQhZJҮQhZJҮQEMYVs 4VvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRBVvRAJҮjQh"IZUۃJ6-^i+JpuFŠ%iWn(شy*֥/4]:ԣbE撴ZlZVvRAJҮjQh"IZUۃJ6-^i+JpuFŠ%iWn(شy*֡/4]:#bE撴ZlZVvPAJҮjh"IZUۃB6-^i+JpuFŠ%iWnشy*֡*֡8y*֡*֡*֡*֡*֡*֡*֡*֡*֡*֡*֡*֡*֡*֡14]:#be⒴ZlZZlZZlZ%&q2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹ'l܉nD7"d훑2vș;fLr&Nٹչ?43Q`q!1 AP"02@Ra#?'!F q s?$f1wDž|F)T&X1+Ow,oK~G#F] },&]A:oߔe#Tg(ϖhGQ\sMyPq)q!&>$#6Gr3'1<<<#(}љ^1ܝX9ĴTO 63B,SZ2x? )&Eϔ؃~?+I_@e:0{Nkys_KDS# _L7, =@(DY&y >+\}MwAYŹ-;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVc[v+qn1ح;bVA#}OU\. Sw|@)껾 ]"w@)껾 ]P z=WwpT*OU\. Sw|@)껾 ]P z=WwpT*OU\. Sw|@)껾 ]P z=WwpT*OU\P z\P z\P z\P z\P z\P z\. Sw|@)껾 ]P z=WwpT*OU\. Sw|@)껾 ]P z=WwpT*OUS*OU\. SwdY,_c%e2,K/@)껾 9@Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeE={-Z)ShOeadA_E!123"AQr4aq#PR @B`0$bDSs?(J6ZPVq Qr,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*Ul}PlҶnlD)k0 Twڥi}ݓMhhQ~bP-ky¨:-:۝F٭uT2aKǹ:7ܚC*.L5pLP%5ak}(cH4}}^iSRĀ@|qt N͹UE]Wumu)O8\Wy b/JQβ;uZOEDdh[nj\/x gK̥9i+[A0@.(Wڭ8EQ c_ZYkZnFˌai֭k\7pF֕lAk[ִkZ(E4~\ yALj-hnTcxc{iڈݲѵKi883kB{,lu5AC@S\K[SHaz7-xVh̼Ufbř3f,ѬѬѬѬѬѬѬѬѬǪg0f-vKh1z}wZjJm6VY9}- Ols)B#p,v]W]ŏ27U1N#kGTo0vYlJiյ@Ydʓ9?N!79U{,,XnYoYmyl>be[~X*o)KVoNc6xg^+&>6M\&W j5pM\&W j5pM\&W j5pM\&W j5pM\&W j5pM\&W j5pM\&W j5pM\&W j3z|c%_;_?0^?@/h~{C ^?@/h~{C ^?@/h~{C ^?@/h~{C ^?@/h~{C ^?@/h~{C ^?@/h~{C ^?@X]k7C~Ӿ}&iyU0䐽k)ZَHֽ6on7Y-s7Ra2zi"٦B}K8yM[!΍>71lsX#hb/[٢2]`FE\YSl %:#bJVQzt=G 1;M_߅%vD - oR#H<Ne,c1ACrdq0ȢJŚR}KٌW?kA&w(L:>'s⽥ߤ,I=5Tϛӡ?Liw?ǾQzt=G 1;E0y5JfDZL+*CbWn`9ie ܒJm5-S6Vǻb֛WlrDnȿN f﹊٭|%Iǵ>&@U=hXvDʺ+P<†-j2I,uMEܞӶ1iNHdsf=S>oN!39|:fɭCSsؽӰ"LI#,x{\ViG9q)%dRCi̺iJ(ݛM }oL GbϿ ؎Ǻ4JE::uE E./i1Εt)wZz}vpsj'M(s8S?7C&xBgsNt^Y(L:3۱t*vxCOsN^ߴӾ1}ɵL[c_76˩ֻzm;S 3|@sh)RLP٥ "jm >"ub_SJ68hж1v36Ąu-u{ڪ"ت۾ʹIjƶo fv07ps/8(>Sdc5ΩluKeavj7☚4ڝ yjtms1RgCLmmz]ު+2:X/qEmhޝn i\7t_(L:3oNyrLàϧQzt;˒g&x4~}!8cR꨷q6GI :THcy{zjxwr45hp[s J{:M TR?cge6j֍ --A*{jJ 6RmL#- Լέg\lc>:6֘lf-qVeď kjK!aieaZ1--[(%@l7hZZaOUuYi^U DhGq)[miAؘsm4ȜzﭑBci5p+q:”+c٭ط&?"iA+ uwOXq=ܷ;ε9M]©9%=Mg~q/{g(`{ֹaruVNyȐYiqv Q>Ͼh -Qzt;˒g&x4~6i؏z1w4 WHv,gGMc"ġ A|=FMp'mFb )O&lZ{[D bsR<5؏qw0a{[Md|û[l:Ӛڶb7p+0Ĺwg Dj9lW7vQ؃䷻6kdcEk}qDSLqYJL_g}}MֵJzKqpv_5*ֱV5uF_ޠfWw}˦;TblTy4.}Ǿije?Z4ʻky[EHLʝkYpRS3wd6 K4K)?gdaE;Zݝ|ve}vVCE2?eֵ-Ѵ82w'Xa7=S>oNyrLàϢYQq&Yhk7C&xBgsG|N=S>oNyrLàXN{ߊ3LH`7+Kv/ n^#oXת=Vm D.p-kf i;[ff6@mQoI{Xuǰh=iv:Y#(Y/5>UmuZɈqsTmVٲN 4ʹN&{HZCNUű~[І&m;_,TAw]{V'1[ 5hk/oXCHzf!u@.o[#"[lp\{tVtbm݁KTkXY{XK4+{G6VKMEοT{I}IA6Zk`kKvAGg.I!dmAfa`&]B2`BˋH>IݓisI$^/:v7\`r]MXee<ŒZKem1VuEdoRG6bg)H"Qe֞IuSL5n-#(an%E s]jѳ#'#3Z渚oNyrLI6G7A~6G7A~6G?ӠrLJ?yU|&xG%>\<#h|Gzt.IGo4P#j>\<#a?s`X, `X, `X, `X, `X, `X, `X, `X, |ޝ˒grYGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqvOA1jūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZjūZoI|CedQZFwo#Mv([n!eTPIE,Ms ]1sm wm|Fhgrdk[k2eh݊kd$}F)k^9CWr:ɣE(5U>?s<:$&8̖% h,@%⡓unͿum2PG~RMWFPc@ RzgAcIs7f&X1=<4ֽ D{潭=潪 v7TS<>G9eѻrΒg8]Uk+@1 OL>\<#os|V+XY`j Vf곷Ugn;uY۪Vv곷Ugn;uY۪Vv곷Ugn;uY۪Vv곷Ugn0fU,f  X~˒grMbXJĬJĬJĬf+1YVbf+1YVbf+1YVbf+1YV%bV%bV%bV+L>\<#osCrdU ep+u^].`=fdy[.v܈1H\A,[v4Aari1FZ Za?gA|Cos_} Wrv7߂Z,9ݭѰ籛Ki[35:S] !mc\s:)znԶS #p?ujb۾-{3 4c-mݝG4{N?hmNݳ'/u{wtVjyef\{1Rv'ÿU @ƻgk3k_'ވC>ڙnI;3]Fʂi&0c8LTas ;1 i,s5l.,2m[?|q;jͣ[6iסqNA֕^4yC޵T <%c-6EMj`{1߼7[cib^DkuFf0]!-Ѽ:@#5k-NWDTеj?8Gkn5ڈfA_޿ԳӠrLI!\hWp}աf|~zh{w,>\<#osgA|Co,U 4vi Wꨜ6hɌ۽sh_AEoM{o[8׺ynֽQtnk;]Wuh 50ۭV)[Eji݇Z`i^'m2{ѥ4k^b6.!o-[9MkLVZ\M~ s͖qVfMk[QDC.ꦆckaE, +d܆h_#6]U7@GYkNHBiG2ǟ>\<#o&>AviBlp(dkK\ @7`KTo#iM[bTN,W)Sd͗+5 Z\{dO 7n,Ӵ&5ց;,zOSuc}mP16Wu{fUu%^+/R,Q}Lߛ7917ړKluiu12WwzZݍR먶FUvz"k׷rm%ݚҗh/E[A4{P-wRwܠZwp<ڷ\K?lm%rz Bg< D\}2FF!un%JdWoAm֘OL_kIC,zmL<@z(LMk+q(i'>\<#|U>\<#)T|V,bV,bV,bV,bUB=XbՋV-XbՋV-]bՋV-XbՋV-XbB-XbՋV-XbՋV-T=˒gr6Ѧ)5@k* 8MQG,G\q+sy-_.c|eaP]^`{iun?-s ڡ=!7t5 V99F1yuS&Ź̘7\<#m94k[S$ncE`s*0o#>\<##ZE+Fš{Z)Rۛ0x&eydk"D#~&Ziekw1>glq }nшSo='!05R45Զ6lcU7gZk=#O[mp5O l:ɥ WL Fu?{DvaHh4S޹e.A3ϑH'Dk+hŻ'gtLa"BڀaFyt.IrXYwYwYwYwYwYwYwYwV#:,Vs AY+9g?\{6CڳVs AY+9g?Qu)TJf?Vs AY+9g?f˒gr>\m>:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qt\C踇E:.!qtD/+!1AQaqP@ 0`?!h2.HS*aL~E< W dG#D~"?G#D~"?G#D~"?G#D~"?G#D~"?G#D~"?G#D~"?G#DV8Ev"+$б1xDгb7/x |*o/@ ݎ 9umӸH[QڤK+VI@д,L D4hHv+[F,M &дZxfqVI;BO:(ZP.Ir)g!-T&]5nV`ĕT7 $)R]EJQ5,#?`_,$I$I$I$I$I$`n $鵶k:a*U4M&nF%γI$ORI>I>wI$Os.bD$oDjhsC49hsC49hsC$9!HrC49hsC49hsC49hsC498iFՁG߃ѳc[JNpCI%RB~8!pC8!pC8!pC8!pC8!pC8!pC8!pCU:'_G߀v HRrG `JWZPqԣ4Khʶ:4#[NŇn S/[TBT `m=3MYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYƈOF偶/#ET/٨{i///////////////////////////////A1$:Ξ_HްEaccoҼfft*RI]r%(WAMHJZS1XLl[MrkE./.B$"iW";&V7aH?&ID;XRZؑ}GX?DjQG7WpV+w&HɧT JLpz 1 h P+jR+> XQ-tfJK\)nU^IMԅ d8bC``ZjI ^JxI:Qff$4SrJU[ Pt.IVtRvhHKT:R aŞO١;4V/n[;7~I7 v ^`LVQ 8SDE*{qz$WB_ڠq]b,G[&˩\FFmbeKMFՠHp4ؑ-QII(J(PJd2IL؜bmץd6l C zza$%ڴQk2v!acO|m]ĕݴI'?Ul$Whv2.!k >l80&0HmBem 4NƽZEQV3A10} P,\&= CC4*D7T%CؔJ[[Hi7D6ҭ?UvtbIUn`vQk!`$IS'@ɘ7KXHn[UJ%cFGv'=eX֋ȇWZ^zlLI+|H[}!}/D`"|]y#RsԀ1ұ)ь 05JGX&:v#\fnE-̩p3 V qI*8C%6J^Q7(cRI֊RmBR̎r%m7.>W K=QՑK"бigđN!ŚW1"檢2PBa3m.!`nrV?G'7c,_2d ) ZS ~__%YY|8.!`nrV?Fҵ.!`- z&e=;ڳ"(@'6[k%i'.;h.YPY'; OsJբ$H$4Yi%-(-Ԑ5XE*@Mת{eHdv5U:Y]hf:$KN)[mD94d]$KHUN9!OX$RÖ򲺕c,"BN٤f()1 uДE:'I%(3K2-M:|@7-#PJ*u5A3+3Df!u#+N?#jH5Ym5x,'d4ll_ ڰ` MGĊVk۬Ko kBp3KvJ$Ejdٯ;d>,\:| S8U 3L0S0N"bjU\#1 _fyi/BIMu'7/4/qhV-S[A9_Q,4AD(s U+ؒCUumb'W+dfԦ*"xsqiFX&Z-W,mf0e#lŏ}偶;өĶm#(ݵ#HXdZYW2- KPbD.&' Q,#&jI8dED0:3zH yՊUC0%ZU+5TtR'bh%K*8Tr@!\#[ryBA}]Z21eT/jJkJ}s}}7,;1=mX#|vVm}6`;v+?w~m01=nX  6<gTw~cbv{*;G `;AY=ǀذʎ~clXV~eG}?A6,`94Q)?yg}?A0BMo#fC)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t2 C)t -|p~lxHR\HٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMٞMDܱl};zrOB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKB\З6%͡.m shKAΓlx AMqU$,M7Ȋh6-{+a6- 5qQM9)W-EiJU 夠o7uZ1lĝJfpT[2U*cW<:m>Mբ8{ b9ғJ"D(R:-+n/HjR}̭f-QIy/+գ3uVUs24t %]<A0aHy *Ša"n,Y k͚rB UiNv?c݀x1ؾ'-.Q7>j>;\)rBGAj!]lx+JcW0f/a3tiUI$/'"]|m%SmDG ڒLvg(/>L*7"lJ)EjJQfetxmd ȢϒFĵ! "Y]6Yi#V[ I56W'y*N%؊Eeʈ)]v"fRLDtWQWQnj;ĩɡFmCy1Zj&gB4ᩈ"t5Y+SSpWth Px&CyIJy*4,VPF]Z$VAR1MDX[X6X`-]j;F6%Vt3#OY(>cqѢkpĥg U MB{iFk؟O0XlrQ_a.rMi,'J) 'n]Gq*;VVgKY;iKTBHPSE.1i_]4#XOeR%"\Kys}c$N̦M#]h(5VhnnD*"ʒe@$Q؈*zgnn2viElx@cOF|R ZI$I$I$I$I'ԝlx 4ԦSD$"Y~ǧc e%Chs}ϴ9>д̉k=)އ&97ɽMroCz3NMroCzއ&97ɽM1Kvއ&97ɽMroCz\5ǃzh~>`o׹Y{dK< pc S8Kr% ʔ:pĎ!UlMJ^czQM/#WTϑ) R*\Vγ+&Us^oGE-$IC$@&[!)d,)T˙QO_4zuxHA+Z4U9^C*#wV[m"2q;v64qz)rVtV4)( > > >ѲH2!S||||| #(NI/W#9Ji&llllHDzv?A{A-H49f,ChrY49f,ChrY49f,ChrY49f,ChrY49f,ChrY49f,ChrY49f,ChrY49f,ChrY49f,  %=I$I$Ђ翂ԲI$K' <Mf(p>6ommܒH  A $  A IIH $ @wA$$$,H$ @I$$H!-$I$hmmm?mmmmmmmmm?$ommmmmmmmmmmmmm-mmmmmmmm$II$I$I$I$I$I$H I$I$I$I$I$I$vIDI$I$I$I$I$I$I$ I$I$I$I$I$I$I$I'R $I$I$I$I$I$7HI$I$I$I$I$I$I$ tpI $ $I$I$I.Ol<#h=$ߌ;$I$I$CىH$I$H$I$I$I$I$bA$I$I$I$I$I$I$I$)$XL (@I$I$I*.< D&IMZI$I$C[ I$I$I$I$I$I$I$֢MĒI$I$I$I$I$I$I$*~,$A]J??qf\ڶ>!g5#O S1T'-uF#N<%5W/hv5k/S22fҷגvl5JԯęY*=Zҿ^6yǗZm"Rn]wby-8;_Y Vm*lUD柂4Yo4Yj~YKȴ$z|OƬױ&Z.w_:4TDZ$"fOf qMs2/l'矷U{ߏAː _1J%sZ3=MzuiQr1'Y5)nx"VZcsuךQ&e)JR)JRQ*)YjI- ̑v}dK$C-U*>ڙHwgFj6頚Y>cBQͷ/74N\ںO$V4: *4@Z5oyADS˝֦0eǭ,K QLY:+YDI)WOrEbWκ)JR)TU(Az(h&hm45ޙBSlj&K|"ԉ򯣼;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;σ;ρ֦uzD!L& ɄB <".'R)JR6/l6 P!B!BaB!BB!B!B!B qI6ajS%)JR)JR)JR)JR)JR)JR)JR6Ǥ?6;+øc=!aJR)JR;qMø)JR)JR)JR)JR)JR)JR)JR)JRYwO1;H iazC֘vǤ?VvǤ?`tc=!(è è>wazCX1b__$yg=!_aazCX?ѿyg=!azC;yg=!_UazCLփ=QOtp:Hz}azCA à:8l=>yg=!=AOtp:Hz}azC'6{@,mdh0E"s<ǒHW#t NEu+צsoTy*IN#2h>eۯA,fN5A(;4$>mOÿ-~OD:wWY엑%2֎㺮ywoB7A(NٯLTm_(+ڿ3QnlT3+7%Jq-_@V#zKH R*sPex:\suι:\suι:XXF|'Ro1,,XjYp5H'D%w#+b({) -4 !!^j垕UEphB[qxFDoK[rMҍhB]b+@.]`tp, HW@8qo eU}MG-T 3K\=699Z<(e.gFy_m Ja[RW u3*kpWLG VlήXj{c@2U Z~ Nh<#U׻΄:K{ ŠqƗExWUs xi˄:@8+wC\FScIKEaq8W?@r&>&*9#:ҵh(Q9-wGK\)^BZWv&ŋ"jr`M,Pd[= 8ZV,ERe(QDfu$0¡amJWk 4RRJM8CVt@FAB#%mz.f74\.sUqւ ھX^1.ͫikgx(^`ۭKlSN(DxƶWQL|ٓ7nݻv͛&ϟ4h*RۗVXnݛ6ǔ2j]s2˗.\p=_댰}Bˋ.\r?28!'qwݹgYy<"sjWA>r˗.\ɼ'2)H- םQC/Q+av2Zc_0 &_[I~˗.\r:N˗.\r˗._7xG@[)5P.47Gq+(1`4 QE Hk]+N3:3r˗._.\_˗.\~}yxk@C<(÷n b e>vEyi]vEyi]vEyi]v%xi]v%xi]veyi]vexi]v%xi]v%yi]vEyi]vEyi]vEyi]vEyi]vEyi`)>%ڛrʘAa?zo9qhXXYݧvxwh"Ըͱ^ar\4ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<;ûO<+u~L.qGkɚB0TC[7Z@ '2|E'@0FdQ%ABeWPym/$1S5-ie'1)K*Hue TH ܛrG.P'vklmg2`x[tSڗ%V^`AhՇ)ޓ%-^)KEDskGk{ EXS7 NtS/~K:_NtS/~K:_NtS/~K:_NtS/~K:_NtS/~K:_NtS/~K:_NtQh3(#ĵ' c1c1c1c1c1c1c1cq#H ~ѲYzp5O"]a8M><ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|ϟ>|*a)1<E.쿘) NG(hliOccP8,]+\YZ"ECI7}4&Tİ'3* uP.o @$,@Ͳ,8% 5lL*ÜTq~ҁ LF@ Y%%!>o&htfhgk&ӭꁣk4SF*E<WK%JT,4,\JZI+jCE^ȏwĐV\6PZVDeF'0`ƵGY5PϦX+7rrL([0j&ѓ(Қ |FC+rCO~ 3CVszvek!w 3CHYC j_@gpE~7htfg7ʅY)߈4'Tp8qmixh cF£/AS`qT@a|i; ҙE5eɆJ@ZTn® y!*-,fA?XJcK 4.82xb?4:zϩKlK.bCb!aS8 RS%[Q PQjnDwM2*ĽP˜¤ud%!a0&ӄ1:"$(9zM-5&諔(O (.,Lלzwמ *YND Ҷnl…[/TFmbBSf э x`͗#栿²sTo5^n# 9=\R5)R3α.$@m@4&HZ4Ҫ QD!" .J"0 N64e}D.c<ǚlrm ara`fI3'`ޡMK* ," f\k(.ckz[VTIME(CTJCEΥd9^:) E\jsx$I6< BkU6VTaE kĊr- M4Qtv&:k3]#\TsL2Pΰ^b-YZUq2'}:s3Dſ7icM6oM6۳b͕6ؓdM6lM6lM6lM6lM6lM6lM6DoM6۳d͇6ٓhM64IM{ONIK 0l6{s|ܦ7Fn)ofofofofofofofno=Losr'=[.~㜀mS=E@5i4CrsJxEAq.\U-ѩe=7b'98-0կ0voAAq[Wp.́y./{wČlż=[5_F^BoA V`ԽH/`uLy.\r˗.\r˗.\r˟ 056?delD%j'niR~a& 3|ϙ>g3|ϙ>g3b; ,MNS|įvRi|̈ UUW>g3|ϙWAi_v|ϙ>g,Pm=՟3|ϙ>g3|ϙ>g3|ϙ>g 0Oh̹r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗?G@ae=L pv&!xch&IԻYUWHL)z՜#543Mޕ 's|@A2-@_=r&P7 WNPfɜh֢U]Q/0K^*-r4,ii8@di3Qml`YVtf ~(:9- %QuR]1M՘M4aX+Z%JJ׀ ) U+[8&Q2p/GܧQTP N0QD8c3fx ZTAkcrƛ` *mEJ-&L,E F5 Sl04xɂ2b-W%R84]L1(@A( e jE@b85@Fҋ&ȭ,\L vkF2j>lR.YHȧ `Wg :8"& h DHb*s!(*q5#PRm92F!W,]WnN"ZYnUǫh)x)d-#jBU\W.KN;ȵJEYE ![J68D:LRBŵF[֭FS2a-ݰ /Dt"܆ۡuRsļ[zb w"X͂ڷXYE-2͖jJQ>W2Bp_^r(V6u*TRJJlv^ Z! @KD E+ @%Lc  @H E:( X%g|S\tׄ>u kf:YiSIIKX0S `ʻσ:N(7+S#YUfT;߉Vv,{B$EZ=K˘#ѴVP2T%[YݔOPksQ3_0BTaNMMւU@ ˱Azc8jMc")Aܧ8qEF:ލaN7MlMR (,ØvnM`h.Js*~K+Y+N 7J@qATܡD3~S x Kkдdܥ FppsS劄#*QM[/ʀ a^J*fg#a!sj(`䆚QZsdT k?"K,K;+,B՟[qae'5 ɿhPB //(8QԞ Ic蹳f͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf̻,%q?tmp9balx013/distribution/innosetup/prog-setup.jpg0000644000175000017500000005532413616566001022311 0ustar carstencarstenJFIF``Created with GIMPC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((EJ ?Ugr"^olB} >ymuŒ>Ǫ; myNgʵ>+u}پ'0}/'qٷbk1I^{f'׎1sYV=pMfŝ}_=,~N~_H @@B@~걽Z$ I @ `@ vomŶHH$@  |לlxň   j@DX-9lHOIt$ yg>Kk}.F[&H'cltQP(uMK'>#{^- JԱ'myϤ׋d$ vdoiŶp$]9yl(p<ì :vL` 'myϣӋ`Ff)s5$@ $NBN#=0Nd/>#{^-MfHbOC@9qh>gk}F[LuS翑 P[~{`jF[yf$.bPԩUw)<13=ðc;]yw#{N-I`P %L 65]myw#z[ u}V bGys#zZ$< 9o^t ASF뷐P3:čNsߛ27HJ!>&ߛ27]zjp.Xr B:S"L76H<]7o޻Gj,yMNpwU|W"H."ȸ2. "HR."HR."ol/Mtcf!V"Eb+XV`+X >=/'W% $Qz% '$Y7*9;5UO5lGw2MTxigOoS{a r9i)3&ޖ`!K GG AE-0襣Jxy@e~LkZֵkZֵkZֵkZքXY}?t]Et]Et]Et]Et]E迒6u, `KX%, `KX$)(AbZhĤ'gGP,?FPC) *(kGa3W!]D$3qZJ厗DL7PZ*%2E G Lό*ٌh˜?6waH෭z޷z޷z޷zޮum[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյ3{bț;VBd+!Y VBd+!Y /%7?_rfȘ["kTHBZZZZZZZZZZZZZZDVǴ7\B#LgjA;5Y4@Z፜[̊)yxp/j*$*loZ""wi?`3Gk`,FEY` 0-ك/@k4FDySL&~D{#oQ 0-g1pzˑc 9Q&,rcW 1)/ 3 rR$J(`><+4<eML{a %iGdA)p1<no.S{G/; ;[S{GoxAFeR४h37.eɪ JxJY8^*_atRBQ@L!r(MT 6ɷ!k_u7|-|JI!r`4݊+ 9(atM8|Bb+li͍捥NwDR,B4tHb/oh^ϐ/@,d Y@,d Y/,d Y@,d Y@oh+2Ŗ,e,YbXŖ,e,YbXŖ,e,YbXŖ,e,YbXŖ,e~{G をQ+PB +PB ?6EVZjVZjQ$ٞ Pʮ̽O0eWJ4%03g$wWW_/e+(9Ծ7|>(UG=Kv7\7+ODi'rwIS媘. z쩈j/?(b/L>y3sK%v2.#ؑşK?BqQ NndȞDf ƊdO)ɇ1454.͝b|`F̍cWc +V0aX±c +V0aX±c +V0aX±c +V0aX±c +V0aX1%vB[i%vB[i%vB[i%vB[i%vB[i%vB[i%vB[eS*TʦU2LeS*TʦU2LEb޿UUXMGj?Q&5ɨMGj?Q&5-̿1XՓ~b o_(W>b o_׫}&5ɬMgk?Y&5ɬMgk?Y%vB[i%vB[i%vB[i%vB[i%vB[i%vB[i%vB[i%vB[i%vB[iyW;1!32Aq"BQar #0@RPS?hְBdKWa=ξ8PިƩɧ(S8"HpM-ͩ! 7~Z6mLʈ:Nq + ܎ԁ鍙]ft|sL&Ӵ:#D#GvؿJs~X6LMPݿxLNɬt[Dd(qsMh{_ڵ xu"ZI@8 Bw&E;-b6;.kZ&nn讑h/wSڃ[K(UUjUZմŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴŴVUUjUZGbg/EL. QQQQQQQQQQQQQQQQK_]7+Yr24Vq" 8(du0l^nPvX}h >g!D!Ozs=3+q-{;]/t0gdʝt"ZpiǧDɷO!Xa'51MK\.W1GumuNW t8Sd=;W@tBPLĴ/. _/L$Z\+e: x&uZ N'6ꀲdb Z$Cl|?nɼ^ &D,&ksZ$&)&C-f|Pd(m2uGuS}&\7//CpMNnm+n'9[q9ۉVNrsm+n'9[q9ۉVNrs\_]7=z޷.fم.au ]lf[0م.au ]lfˬz3oਨ)|CGILh5q)e] .IkaޢړD7Y=' ?>?ugVdK yܚƺPKQCxyq؆Ms#{8k"I{_l0n+1pھUNLY :å.Il4k BEj7D`AbLk;R'Dkڽ\s5`OpPǏaA| _6jkZӳr -4:۟ FfѺwP-8%>~kn!ZsFu[ؾ_UNL'x=Oi Gr‰XQ2 &AaD,( dL‰XQ2 &AaD,( dLD:3Xq<LÉXq2&Caz8U!d=VLÉXq2&Caz8U!d=VLÉXq2&Caz8U!d=VLÉXq2&Caz8U!d=VLÉXq2&CLh_3CJ%APd2T* J%APd2T* J%A亹.K亹.K亹.K亹.K2_ 74'p^!(| *‡ʰ(| *‡ʰ(| *‡ʰ(|S8Ln캎F(B")Bgta"NZY-yŷ(=2˄kd)jJ) .@ n^ -Yk\ nd c7\ɵϳ_<~';/]ЬIa&h{%ۺw(os:rrלgۗc~gOSC"8'vlOsY~RwYs|_]& Q;Vc&`oJWal dJsi]$z"͠η#al l&kѯE1`!X6rꛫnA3O&5P 7z 5Rm|4?g:AlV[+elV[+eHiK6Kh䶎Kh䶎Kh䶎Kh䶎J%STrU9*NJ%STrU9*NJ%STrU9*NJ%STSx2dLZ8zf(Zr$v4&'"&Ոڿ%b.]M c\tniMt[j&hLHN/&b}Mߴ|?Sx9҈H?6b!Mg NM5('iD',k:nB sބxTڵjwID{Rqޱ̅9"NGF?\";h{-^@ޢ ̫6*IM&|G' C1:7@Fs-|mC 0Xć$>`!,H|bC 0Xć$>`!,H|bC n0[Pۇ$>`!,H|bC 0Xć$>`!,H|bC 0X?oP*@T P*@T P*@T P*@T P*ASx|MܪW*UʮUr\} JU*TRUN*RUJU*T-{#DH-23vJΦ)|YjâCt+`4wjԛ؃C'wC/{bYe$9idØY"AS|83m)fk\ӥ"_q`ٵ+EmepfwJ Gg.M=xFÜoV'+ZQ[dͳPl2IfsEeލHh>/M ˚m4'6$Q|n$B]+Mh#5(c6BpĞe.{ "*Li4Kaߦz}t?o`:]XCXCXCXCXCXCXCXCDX Eⰾ/a}k X_Zְ2mX_Zְ/a}k X_Z?o%Pw?5X~ka?5X~ka?5X~ka?5X~ka?5X~ka{W*!1AQaq 0@P?!#HRE`1B.N%"(E,.Qar X\(E,.Qar X\(E,.Qar X\(E,.Qar X\(ʴ"+n,Sk5 $cH[UUJw6_|ܿP qXW`&U]$OxJ.5EOӇ%fJepUc- ©lT"%Qݜ~~R+n_#z3PYS|A*K@`JjKk>AiLh[ +*N^7E  B/2ZPеn. M`@҈{!j(:iO<j^0Ʌ5o U,ful D\#Wg% u&ngϩS{>}M7nSt>}M7oSp>}M7oSt>}M7ngϩS{>}M73O.888888WU:?hM9Ǻcyf1ac9f1`c9f1`ccqn117ccqn1c30s1c30s1/$ qqqqVOyL&j5 Bf3PL&i4D"f3HÀӔ68;:yM2@0bZ| (*:|%Y4еmLѭ#A b(M_dM_dM_dM_dM_dM_dM_dM_d2K'tq         3t2A'1c(F?1Qc(F?1Qc>T&MP5Bj T&MP5Bj è浄f>m*N8H~@|͡M"-hM6hM6hM6hM1\*Gg{k B0K0ٲ ÂB-@REܴ,w3)07XT\A@R1~\v (^U4,&9oDBepz Hq&WvKufTU3}$@E!:Z P 9FD88'b(JfeU+|>347b+&bL)3\krS5fA,{hXKqqqqq,̄LLLLLLLDgU5l?^^ <Z?1hţZ?1hţZ1iŧZ1iŧZ1iŧZ1iŧZ1iŧZ1iŧZ1iŧ 杄pJL,p:R*]0?jtovQ+bP!+"ad~6C }I%%0IVԀ/fr tP/4oqC@FÎ+ѓp }RY+<%tM~"%΃`,Pb*1'3Ya*2m!}ZkEx!)"+)+,z8Cf&+ ~4;B`Sb% =/ IE82?|Wհ歄pAfn9S8 g X C.HxB mJ)dF D# +t$ U`=UfKbIAoFe-@ 2A%vJ '-N`@t/xXNKƆLIx u^Vjx c.te/ Q5jfu K|!S& v}+)%{مEe{$Q u 9G %`C25QEZ<TWJ,lb0cʀ{?Aл=;J-O" <}PVi u^Vjx  eFf"@a*L6 8r3ħU5l&X@ 4qzM`4NjMOLcΝe\-:.(I$`zsWJ#@,U\PHJQQ2DZۋPCĸLKM>kQd qhqa: ω0,ੀF';#J`X9x"+ցJ`(Vi0_WհVC?" Iniav&L6\! h+y(d7 X@$SJ[-࣐ۨIAm( "ʯP9 IeÃL0X9F,5:ya,[#?=3]^f5Ej/3Qy^f5Ej/3Qy'ڱX,g5Ej/3Qy^f5Ej/3Qy^bvR|u^V)ld$&6IMld$&6IMld$&6IMld$&6IMld$>zya!Sy=Mz7o#G DDDDDDDDЉy *n"n"n"n"n"n"n"n"n" 2:ya"[lվ؎Ўb 0:ya'x]8L&WN+ ӄet2p]8L&WN+ ӄet2p]8L&WN+ ӄet2p]8L&WN+ ӄet2p]8L&WN+ ӄet2p]1* R3ma?Z!Ӄ{|Kdo[$"ݿ}J$ Wo~ $M dݶnI$$oxIom $I$I L$H $I@y$ $ImmHL@$I%6i$MLI$I$0I$I$I$I$I I$I$I$I$I1I$I$KmmIM$I6 $I$[ $IA$liI$_mI$I$Lmm6}}I$Se-%[,I$MHI$I$I$I$I5$Imm[,muKeY$Kmɺ/&YeImdH-$,mm[mI$[I$I$I$I$I'dI/M=mme~I&w$I;[o'mmmmo*a!1A@PQ 0q?r6&?}ѝs9͚8:OXQ)0l GXU,Hvry.ֆsCOfb Io$>`3lnqc^ %T<bǫv&BGУQ(} >BGУQ( `dnM=d~tԲh?hjY4]5-!7z+AѾ /tԴh>G=RѠI>IwMKF?_릥AѾ ]5- I$I$I$I$I$I$I$I$I$pjZ4OIdI$I'dI$I$lI$I$>MKF?Ը]5-z?Ը]5-~pC!d2d2 C!W Oijg"Yo7 o7 o7 o7 o7 D)a!1P@AQ 0q?B6;N'[,3WSwq011; H;퍡_]:Do"`JXoܤJ%Ұ)]"' LD/#T3J{m&!>lLqr I8{_uCmWs-)f= j{CM+C9RtatR7mJnڔ)jSvԤIRmJڔ(;jPvԠARmJڔ(;jPvԠARmJڔ(;jPvԠAR'mJNڔ)jSvԦMQ)_|KYo?f.~&d]_[5v>d]4I$I$I$I?ȻyY#Y}lE٬EȻy5v6k"S>@P( @P( Mwf.~`*n߶V핿leo+~[߶V핿leo+~[rZ^k"m?/]lEҫM(!d2 C!d2 C1yo.k"{ ++++Ƽ[5v6k"000000000000000000000000000f/bk"/f/bk"/f/bk"/f/bk"/?uȿy z(vk"":AAAAAAAuY?f/AAlE?f/I$I$OW?ȿy ?(D"D#D"D.k"lG̶mq798snsq798snsq798snsq798snsq798snsj?)!1AQaq 0@P?u YV) axu**#X,խdiŧO- u/Y`A?C)33x& Dٱ4ʰNK$ŋ%u~GĮD ϟ>|ϟ>||:T"#c|Lu/drk.\r˗.\r˗.sӟ4?9iNsӟ4?9iD-W8~{" Еvk7.D[Q5e K--"phA6`0oG-Mf2 eg(@EcUr˗.\\%6c( ]/L=uV &k/F-Q#.ϯ@7J C8oRDTTOTOTML8X݋L.H M:kx*asꋏ(2aűo[ ߈xQji&I:-&%ZfP@=@ˠA5z  (JhR˗.\r!(UU@/"C f\iHtv*4.ZuaPuDPYD>N/~ƷBieMҊҥ"J qv m^OG]XXasꏏ(5aJ!Sze˗.\r˗.\r,iUM24M"iHD&4M"iHD%9 罬S ?T\㥡/)Pnf%#)HFR2e#)HFR2e#)HFR2e#)INRr')9IN3X@K?T|}˗.\r˗.\r˗.\r˗.\r˗.\sꋅ^FVIý;piý;piý;piý;piýϊv8{Ni;=cpӱv8{Ni;=cpӱi;|QQP˜?T|."T#hq\r˚@lr˗.\2`]8U #q?iOq?iOq?iOq?i<:%ĮpQpAr!k;[NhyzG|k-YB7D0zF4DEDhɮPE]aB6l +9rV[UR>:NUP&/.X SZ>-%cy1Z6`V_y}_y}q1rL fbaP oC 2Apɭ*GqVKG-Z*k:@:4tZHyYeU 3IF d9beW/ә2iYJM#:Fcuı8>V9:'39/)u&@_J#5@0җ6&Ϸ~[/LD?rY,QT'`o[.4kyL􀒪uA:FVqCz:[o0~g :~ TQ؈D\Vե] ֿP02@#Ly*NyuP*9LNnlc QNU -K-a%ej]Yt>b7cCP V?bj$8 iM'*(U[;Q ]"*5fP^.X፰JFD’YJe 9:̈́`[%[ylG.Bu kKڮV&DBU;5QL[IaL\2E 4gH*zJ.\r˗.).6أЄK=X#-C PQ] 3G{ f%^iMEx"X A& > ЎWZI:%,0&֨Zz偒@vL,hic""GE,#b <2q؃V6YAY,#5;bI̺Kæ+BSG] )NpFՠRq?ԻHScy"vȺGOSٚ"GTLVgDt'c)7@Ѥ!Z©lYB[\r˗.(E>Vأ.\r˗.\r˗.\r˗.\r˗.\qBpQp8mKW@=8)D&6(!1eP@p,0 ëzk@EC^!!ʯDz#j ynJ"`.ia, ZaG0\i. ۅh˗. @hS{LCD0A1o)wtw (-#ltjܛpѫ9)6 [ U %% ƪs`etR˗./p]?N?siO~!:vvB 0̦HS YYyAu #fC U+e JĢ:# #-cEIXP!)!t]Wx s*նUe&u:iӕ@G.4p^*X/VD1@!U`j1wL5f ,J 7ĺ Bt(,iXk\d&HGᤙL@X}$IUb,B`S8Ž`=?G}I,[MẀ}-g|?T~UMڟ!FĠ$(\Q ie wȞ#bw(j 4cYfGP8[~pdZA̤ߠ^/3lE'/v>Tp X8qkQ uiSMsFUiյhlA-*M0 `ʹ=5 tD^3Bdތly4\j:mգTc.ʃ7QT4}>p]?NT8=Y۠ ?`cF24\c{{A ƅKO Jg ^G@&뒜,6Mj#HAVFPðd3EtC E^bK?nIh !şpxErGX *w kc[*Ux+6C&YOK(@PcPmhEGQ)?Amg'JkB ^z勠+UƔ>8.9k1F߅E]  0` 0`Ew_0t 0` 0`$5Z]ײx$I'O <x$I'O <x$I'O <x$I'O <x$I @o8.AGo` 0nްԜsOi=4sOi=4x'hWk@tic{Ni9Ӛ{Ni9Ӛ{Dt+*g?Np]?ST9?<-A阡r0mxbhmhSMiu҆uhh-e0fWl舉h\ `,Ѝ)7'jɟz@b}uO\Vz>or@m:]`IZ}JCJ^i=s=qX?8.*NӬ՚0 F*&VA8gm_ ME8 mߦ8Ib"(H Ap(fRPE\Β ͕+9 &ؼѲz DpB_JX.(V.rٓz%䬟û?B&ыKul R-Zms@XӰm(ЮP7ďP_t5b?oQEUUU UNp]?"">WIWZ !1AQSaq"$2#BRTrb3CD4cd?ءH!JB"!JBB!BH!BB5w> BC<%? F!64ߥB g k˟,))Xn8Fw rlV(|x|q&hJR»䕞TFXlFw?IW*z(#|&M ,)#K? xJfE= 1{g>݇>ӱ3<%˼cG+9s "=Mm=(Z}E]/ԬG}ɦyJőC_s<$JSS0aИvԺ%YBBCE]>7C+Pӽ\@X^01#%,lv.LUE5C6͚+qdgFRYRT ۗaAJ.5i&W͎H qKT!.6iu{;ՌC&TʆŮpp6 PD})gOJYSH|`xJچ<_)7P7J.> Q+8$ĎJ4Pct9sUS8p'as޵.h%KM4t:Y\ƍIXN. mBH^c{dGPV7ji0WlcKTJe|7s%5r-CjY367|UmK5|bj))[:kKqI*%9F&Ш_+I$4+|~TtWRM;VrYy-5+ RU6#M:{I Gg* M+ٸx(Į5\aS: =UܓrWJ׹i pFHORFkz/݇hc<. On_jR=v'WѰw$ yAqCpTuN߮oKrJaP v07*)j9?Y]o,N©cYT#5%͚6`pm`-5#2)OyԆ0QTܡpG\8 ݡUKS ur8ܤBEg[5;m‡[|z᱗9t&*$ 6W]+Z5F3V:ZyR)B S2; ?FR`qi|IHiF}ee;@>r .ZCH#PFkбi QѺgmw,MDW=%7$P8nB9aM$n92=o#}SE;yJ7RlWp+A]"IT'1ݱ ;1)=s'*)Rҳ3_"_F,Р#!!aue~.د0gwZ <^#IoBđmBV=ѽn֛k\f 㤍ry }ޫ^nW(+&g.Z|2-^5efB7HފZ\آyALqHٸ,ˍD$: |Ѻ[H@T!#+| 4v= Is[5OTgj.<>3k[lG5Sci~d8dGl;aYP,3S3iVy 97.7):&s ܢySp jâA]؃pRAWhY:,J j% A_UmHb]h~K%RG{,iqYskWaѶ̓]6VSjIq&RH9څ͂fuâBs)ɑ0|zZ E4k^( fRR9ہw,4Y䦐͚Q3v7<ܮ͂DLW8p77o򫐄! &}<͖3b7t 9wbXD21X+:h4)(B򚣒l R^q6G)#X>Ѳ!~M>!kխAЉ#t5!VҼѣ;N[n ,{u!pb1K SYHpsM7n*TUB?  ;v7@}#stQvP.w*ntmɟLfgh18q r;a{X^}m !$W510+[HMv.&&m<Ji+4I͂%97rbCryRhm ˷'p̒NZ22*I?< bҕ, 6V2*`O8}CF`68䉁ޓuM9y.yx9|<þ2/U'FYz8 GQSM0{!!iZر P$cY6\uk[( l{D8ko3-V;m%` HHe[5w^ɶ;2LMCM ؤ6͵/v.|zЏ7y#ǡn=qGB4W+ӏ,:M-jV5S Y/ǟg6919LNצ"mϳ'9ֳ&GǴ7<9>lo^+Di\Vy4dsezim "lOǴ",k0HFy"ئK5S9>gϳatGy%DiuY˾|&u IܵFPOgJE#PӴ]0jFzQaJ&%ϊgfeHǃ:bY)pw;k~Q- &Uiݚ¾R:1ᵼ6u֕e3"?hz?6`rdǦ,G59tL\qVS+LDy1Hbhve1 ]ɆYǯndBaýXvv>Ua+oeH ^3ɤ:1pÛ%+Uчy*Z|NE<.[uQǶ^<{ʖg~TAet2]6 1i yNV8)b&9vL8S;_DZJK,W2w]Wln8+"ezÙtx +Kop= dhԶGؽ'.i%-fOu^wDΝ#4V qC-ҥվLА[4:0UR7TPfxΚGvزvVaI{3H&#%-:zf)>⼵Q+9DΚ۩@dqdtǨڕ B,T"G&h^ƍ~ 'vRS *۴0V"e VӨLC\xz!#@28-?huYY 밥488W{HԻ{($HgyL8|+=zrU׿՚v^iUWvgUl8mn($$qeΚU jtC€$Gu6N<vRl%ơZ}5t`unf rNXgmk˩@e{ijÊ6~?\vg 0<4vᮩl-fw(rf|1ږh9sNcvR7,ZM 9sƥ]褦-c4wiVcQl뵩&lm imN:듓9Ҭ/o Ge-yoreBaw_gv4:qWUږY-ݬC\X tN8n4,Z?DnIz~$8XrMy٦֌rvnoi"pٸONӷpt;{76n;{7N±PJѸGJӸ:Vn{{PbyAӷ16IKΥKå@H+5B{1(H"g!Nz 锖ӆ5]tJkPDHmb6][Ke< {vvOlrN1:;9Ѩ9Ѩ9Ѩ:joF[Ѩ9Ѩ9Ѩ:jsPsP`[Ѩ:jӚӹ^ M-DYcZ7B6)7K6Cb;iw#8'Ǔpƚ2ix4@CZU,/+Ea :2b$Etu'Xu'Xu'Xu'Xu'Xu'Xu'Xu'Xu'Xu'Xu*.1WHZ7_,rkC\va卢*r1 f^|6UmԪQԄ:qS$Ħ!gMr5-Y韕!ѩ w a=hOh ;pHtmp9balx013/distribution/innosetup/Readme.txt0000644000175000017500000000057413616566001021435 0ustar carstencarsten------------------------------------------- PonyProg - Serial Device Programmer v3.1.0 PonyProg is the universal programmer for many serial devices. If you want to know more about PonyProg or just download latest version look at my web site: http://www.LancOS.com --------------------------- Post any question to PonyProg pubblic forum: http://ponyprog.sourceforge.net/phorum/ tmp9balx013/distribution/innosetup/prog-saveas.jpg0000644000175000017500000011461013616566001022425 0ustar carstencarstenJFIF``Created with GIMPC  % !###&)&")"#"C """"""""""""""""""""""""""""""""""""""""""""""""""" G/y 9EOOVu]gv`&Ύ,$G3dsc11uS'= t1Le O7zʈwkSt|+؝'&OMv&:oi<' Lm\I`DYPD0$qR|v~M 9d22@ 0xv7tv d  2 d `8`p2jlhn d0H `I@`<vMN2%㯢\eKvOxy~p61 |ąo|iX2xlMG~<= m5p]B@1UЯ: t@ xCAM>̲BldJ <7CDs 7y5w` ed>o[ ;^jSgIm1 q®'a]kU+n/>}7 ٽdg7*|v]Om^~o1 q¦'ka^gkUN&n0@5.&;$8Tl+yc3ג:I c@DO»ז'Hh  >{[ ;^ZG\&j(ɂc@:噒b^O= (-l|j" pŠ:ؒ$&ΣB hwC@{PT6UumT PSpN)8|Ҝ:SJpN)å8tҜ6SpN)e8l Ნ2SJpN)%8d r.cp18\ s.cp18\ ᒜ2SJpN)%8l Ნ6SpN)å8tҜ:SJpN)å8t>SpN)8|Ь/5! HjCRԆ5! HjCRԆ5! w0vR]Ku.ԺR]Ku.]OoJk]<;u+k9+%)f|]Yz37&JI66jbWu~j6NDREGSt>bWu~\b:M3QS1S+?0zM("96Nʩ%|dc?ڛܮ%mGlECQ}?ڗܮPW(D?_KWnV~k$ڒ'>bmKJ(͉jSGKWnVkRk"e4n:Xv##OÇn:x[z?^*rG[0cF1Uەh?tSjfI%Cެa61Uh?]*SSLV>=8MTj:]}?'m}Y֏>FFe@5N*bHVvK6IytJ\=]5^ʲv1WXG""$Ջ5C# 8XGҿV!;oΫ:_iI|_lVuY*ϏuFRT(e1=3դ~b+:)ce4<=S9SƱE1Yڕ}Vtҏԫ3JPm2-BJ>+;Rޙ=:I`ڙN؝ĭDc}J>+;Rޘ)N5iWoO(O ziE|ohUuJ.+{BޟQv1[^ҋЪ]VW3s9g3s9g3 EtftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftftdLޟ*عr˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\W?b?*G옝;̚ZϭuUoO[؟JC9BЪrSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSIU{DE|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS$U{!jeLOrM1?{QU+6|A3WWUΪͧUoO׫e}TR;W| I>dGia>E;#F4PȐT«ޟ1ٟeb© c]I,R} r-YDk]e,RYGW?LjLjLjLjLjLjLjLjLjLj؍<S##########!koJ(( ꜔C(1ȯ\K&$BQ)Mzf}PtaLHA x;1}9%݋}eq8TQUg Ϙ".TӜ}zO暄>hա8y8M+>;z&LpD_]pJz &q܊dM7 0vͤNjzM#V#e&`B"=QCD˪ ,@ ,@ ,@ ,@ ,@ ,@ ,@ ,@ ,@!aЉ^.`sf9xxV B?+>;HuRG&Fϥ;^RA8\jjjjjjjjjjͤ?yyꍕJhHXwzaޢ=Ez ,3XgQa=Ez ,3XgQ3/=QCL#.ͼFϥÄp /B2PTlP;B+>;[BO4 =yꍕJ 䋞H= "@.kD2+>; Z]dJ\ў̼FϥÈfzeg҇aYqfzeg҇aYav6V}vHf^zegчaYap=y F9tC/=að Xl08ν5ϣÉ!ٗYav6V}vg^egчa!ٗYav6V}vzk Fzk Fh^egчaYav6V}vzk Fh^egчaYav6V}vm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.7Yav6V}vjwzk FڟޚegчawYav6V}vj}ʛ7)M oS›7)M oS›7)M oS›7)M oS›7)M oS›7)M oS›7)M oS\~Ya}ڐ Xl0>H?ܿ6V}vj1~)SuXMb7UnV)SuXMb7UnV)SuXMb7UnV)SuXMb7UnV)SuXMb7UnV)SuXMb7UnV)SuXMb7UnTNbC+>;н5ϣô/Mað Xl0;B+>;н5ϣô/MaðM"X3TeOӽ5ϣX~eD ~J9 nN+>;"/Mað Xl0;Bv2Qq3a!`1A 0@P"2B?3)`G%>JLkK^݆-BN}0n200⏭_ aFqu@TgGcR UFf.$@2ꟀOOQA "CijzW rE!%؋v c3"c;2>1>HLfGiWJv h#90DI(/2#)=rAHe 3#/$aH eU!GALt~GGyĎ%3X)/q\1R~!'\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7An\ st5k7@ӤIۊLQׁ;JM^,iLw;k0j6ϸeR^E1 2ɒI""$L$eA&Ft;gp:D]&C%E 'mD%LRAajAoRA dFK?d ODDKmwn*FAdFAdFAdFAdFAdFAdFAdFAdFAdBi8?RQGCGZg'(lz RR>="T @ۊoC!t${ @ @n0;gp}*#Tg5QF{UTgQF{UTgQF{UTgQF{UTgPf_ۊh0Xd <3wn*90XJ9=lUO*9/ ۊ=I {qW4R(3wn*{qW0;gp>;ۊ`v_xflUCwn*!;S>;ۊ`v_`v_0;gp{qW>g0;gp{qW =3g`v_0;gp{qW =lUCwn*!;ۊH"D$H"D$H"D$H"D$H"D$H"D$H"D'wn*!;/v_Kx{qWRlUCwn* Rf!D3Ȇy"CL=+_kޘ{qWVrͽ0;gpId.!t ]B2A d.!t ]B2A d.!t ]B2A d.!t ]B2A d.!t ]B2A d.!t ]B2A d.!t ]B2A  3WlUCwn*!;ۊ`v_0;gp{qWI}8!`Kv_G)O`K* {=$}=lUCw/E12!Aqr"3Qa0P#@B Rb`S$4Ccs?2NR/ΫZ` PsFDMP*@T P*@T P*@T P*@T P*@T P*@T P*@T P*@T P*@T P,,lS7,/lY#SSMho*8uɻqJrK)0n-eEri8gLV䋋)fn,!3iIb{6 tn\ш98hs IB 'H$7,۝dK݅ .IpDdfm=A9eLO~ ۳tHbXkdDs%j}~ȇdB[C~CP&,vwΪ,8=!s 0@ -nSX_@, )aQ]z-i؃\'.Z!R-ir"A; LvSanC; ZBY,#"̈́a>Y0Q9n*N G ec0o sW1\sW1\sW1\sW1\sW1\sW1\sW1\sW1\sW1] ] ] ] ]+b+b+b+b+b+b+b+b PtT*PBU T*PBU T* UUUUUUUUUU]Wh?48;q* js!Ċ% [)IylnO|:CCk?X2u/Z{ֶ[1u1uN-GD(E9F<d⬜}m i2@{C8lģ 4:2hҘT\o/J}GCkafoDhnN,RiTbfS"+ڳ̻Vyj2Y]<˵gviHe)ы !=f6bPKjA lGFtĈqr٥f,[-#CMN{z4w!idVq!.2n$FfQ{"Dh&nfR(tG7K!MGk&N "&Hŏ fGx NSGW fG(htg-d1 2|7x { d0܋Ov'5KLvu}ukZxϢg|pw Nr'7,)-_+]*WJUҮ 5XHqAߣ=7w9#z!a: Gk~PÜvM#CAZUZUZUZUZUZUZUZUZU}4#3e[/'fK![v.!@ _Q؋NFJʫu $D8Pr\dK=̖ 7 ăAC_r)ᐡoz˯Qd1^*x~p#F*LiPWܶ(7ͱ6˪V`=߬k\5J %\bNWC5Pw0D75s@|?p|*_^]v Ϲ8sD,FٓH7w21DjtHBk:8CQ5v'i q} qsO1%}|tF`s5,Ώ> J8B)cl¡3kG c >3晴 7a? 耊 t:$oMn)'0dj^TM&;.CCf&4g)BjZAB١,ÈΨ1Mh.*A'ؚ_t&CItl tzϒ:>bz"ItfCԗtϺ&3Cn̨cTٵ䵄JM49u@#|/8 vF]yѼhko57vF]yѼhko57vF]yѼhko57vF]yѼhko57vF]yѼhko57vF]yѼhko57vF]yѼhko57u\p|!UsUZZZZZZZZZZZZZZZZZZZZZZZZZZZZp|!Zsn)S#Bw!E?D7@PB d+QsC[B~?yMD|#Xrg$&mFsD7@PB>08ER'j>o>9;Ǿ¡}M.?;rfc0~' 'x8T>ϹLI`]2'G [52;X|!7d}خv`txnROϿNp|!9|RwoXU$69ԙj/35@TD7@PB gC쟝:V!?>o>9;Ǿ™M~ ݧx0u/hkO,QL.!rtۚ'p1:c(&&L2M<`Hq=zQX$dWb?! gAa`ZZĜj[d(:A.&[,lN[&C8 {,P:\!`SDKqb;\{)!3U"w6pMچ{o gA6$~͌$O5CN(a-"Ra+7jҩ/ae"LfeܡXF</sd:g!™@JNn,;Aw HXwtDI$o+  , &xR75e#88sy=73 nh~`qϿN)!D~5%Vz *}Pkbs-DcR"O5S5nk4C"f&ڞ^8!!{o g}rw} L!- $JUoz ZQ?)c;]ٗ0{o gт,M[^cO+D\"!OcE0blHeMq-{W8I}rCxS8G[ǾpND1ߪNpM5Ӝ,zaSMnM}rCxS8F2N{6j0HݜV~k"0fH*3] ٙ:{87-Us}rCxS8Fc]/]/ XZ`wxV>9v)#}rCxS8G[Ǿpy˷} Luno™>.=73hVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկVZkկE;롼)#ֿUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!VUkZ!T#xp™>":Mo3YwmP~3TX8-|{:nt|Uv)#9M2UYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUYUY$,73}|.t"4 '[&D1{溎kqP H2%yL}aE؂ }_ ӏB<&8Jg% ŃS_4~խn8p6+8j:Ξf]3{FNٱM͉3;7'%ޡ+ .ÛNid49"PNXJysրsixx p"5B<.M`&bS.i΂fD;R v'Ci-3$8TNv>D1uj0M8X &| ui7OmZEI6"YjuLX ܰg<45MDςg5^dӉ}:M5VM8"}%߽3{v+"d!*)}DFK,H#s^ix˜( 9|7Cyvi8+-X3<0υOF1auw"n,-cƈbf2(:(t(̉?'Ä;X{=:S?1#'&IR[;XhHŬD]!{atD^n7Z=*G^(xp lF8H8NlQ08mMbh\"K9Q|F"8Tn|ppRK?3h畛kxS8G@*UbXV*UUbyUjUZVUUjUZX_em`V`V`V`V`V`" %)Bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-bض-_+!1QaAq0P@ `?!lR#ANfQ4X؈8es!G#}b>XG#}b>XG#}b>XG#}b>XG#}b>XG#}b>XG#}b>XG#}b>XG#}b>XG!$R]rh bO FDaC^#ȝuY2S܆qjI}E_u$dOku~h<vN)%7&'i녜1RzT&t%TI2);d"IgΤJԩkR )=JUA^ N >x)(d0c %tC3ZZ:ب&$":GG.u5sQ<+%~]G|GB(b*$|^J_@ a Q" 4`M2eJL"~l&ŠD'$6e?1RV^56,᱇IjY(lFi逑M 'q%a,Q3(̗uJ3:xŤ)7n[H]lY$&nYʖ/b/b/b/b.b.b.b/b//b./b.b/b/b.b/b/b.b.Ob.Obع=ع=ع=ع=ػؿػػؿؾغظؼ=ؼ=ظ=ظ=ظ=ؼ=ؼ=ؼ=ؼ=vjGvb]~/_~/KI$I$I$I$I$I$I$I$I$I$I|'|$]F Fk?k?k?k?k?Xk?I“MfM-$I$I$I$8/UܒI$I$I$I$+}n ^eoNpGv{wc|1$$%RE6MrVQFfTP5r듉ũٔJ_sZ_ .<:߅5&liUʣGxBMIb $/&-$I.B$4Ѽs$i2B'-u[zZunvǣ"rᙌɍZ I4؋;y $I$Fa1:#Q /U[E[E[E$jS6⤩xRbuA;IbjԢ2"Ҏ_ +֧MjlwNǺcV*ʥ.Cvx5yk5!iAqLDON b(b_2|`Q*2%}H^.O"Gmi536hHe?&$Hyš9KNTCݹt7N$5Q%Q/UTO"S'!I$IP]1$I$H~m+RXKԒ[L nnNN9?sb5ie$7VuOsubtjM2ފmOyEKbi XDg" %g\}=כZZZZZZZZBdƲw~,&1RVu/Z6x6&lpBKpD%z*-<ܶ($Fe(KKbM$%8oVo^ +Ɣq!,!ܼ" &BڤJtKIld|QU{cXJ}jBj="TBI6'׫џx==w4y_\Lt)Zu Ha}DsL(==YEDp,g 8Yp,g 8YS",Tdۥ&$֥1LyIQ(uWM&aѵVBHL))Ht1 O]qb$ dk&NS?{vrb0P uU!SHdDBxQ9W1GP]~NXj*eJ; ɇe,ċƽcлc';VqφcZmxXMl# _o<8|1y)U6Y`7{Lz~"! (B^4#uԮ4rf)Á9L&<L^KԢBO\dzHԈZTT0&JV 1y stLJ'|&o<9bDм"Sr3J/'#Vq| du$uЛ%Xq%pQgb|;v'O؟3>gb|;v'O؟3>gb|;v'O؟3>gb|;v'O؟3>gb|;v'O؟3>gb|;v'O؟3>gb|;j/u;(r;v2mI?Ί"~9G*'E0u'Rpt%컡}N6u\s9<9ڳ!CRJOȑdC, %e6P J"D5f`g_ܸ YeUS`9}`9}`9}`9}`9}`9}`9}`9}`9}`9}`9}`9}`9}`9}Qq"j/~\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn\&ɹrn6|G;Vp ң- 1(N! *KqVQch@F@3 6 'W E )`73E_m1IbcbfDҵ5noiyb<9ڳ żJ|"vKh R([BX4:ItQOIh,>l+\:>-cS9jg9M JuyhGknkF<һ38L9ڳ)Q墓$Mv.͊c.Kv.ػb]v.ػb]v.ػb]v.ػb]v.ػb]v.ػb]v.اnxsgC8 %fJg ?VA+4ctmIy1RxGlIj!A6TDL'1[FmtXjD Kxq&gQs pgZ+Pb?*^!JXHbpu9DTI+ExBzI1UVT̘`<Q2;ˋl'լtVjqZ͎LLN'1s&a7`P(IMuBbokXd׊x&DULD]8+BxiN^NY9I™b`h96_;Vp!~%qFIZ3i>c tֵmjF8F_8<PʔpZ" :*TRMSjIzraM%lP\7(VbH42f~;δɩJcgb!## QTFv*`*pĦu&j kbyFIMOTx4;֒t]FQ4=Q#'gM$r6E4d%OQ^^ГGQ:mDF9DTL~8 Ce4I ٶYeU,ػ=ػ=ػ=ػ=ػ=.0pCQˣغ=غ=غ=غ=غ=؎U՜_aOQLԥRgVI)0 3 Yƿ9qDbfeTKNn#@7a:,^:zEF7oYe^fGq@kgKKV.EU::9MIHZF6XY*5%QP䄴y 頢PDC*CGch у܆PӉ$PZKYUPthS'Lbo"d1]3Sh"4)_Xf*ES _#O9ڳJo42Tci9HVҡ?Bf49IАɱu:Nrd54*, *R:!d,B)LCÝ8 jjQc,e2Xc,bzTOFXc,e2XcBX5\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹ\kq5Ƹc% [mmmmmmmmm(X$I$I$NIa'I$I$24I$I$I$=kh$I$I$I*DKm[l-[d[mIm%Km[lIrmi4,m}!I$h$@HK$IKA E[6mm,[ A,a$&iv^{W4I$I 7'I`I$!f$4J/I$I$+ڄIm<zWq$I$I$I$I$I$I$I+lDI$mmmmmmmHI$I$I$I$I$I$e}IImI$I$I$I$I$I$I$ڭ$I$I$I$I$I$I$Ouvmm$I$I$I$I$I$I$Iڿ`M-mI$I$I$I$I$I$I;UI$I$I$I$I$I$I'mmI$I$I$I$I$I$I$oV$rI$I$I$I$I$I$I$?nI$I$I$I$I$I$I$}m$I$I$I$I$I$I$~m9m$I$I$I$I$I$I$Osm$I$I$I$I$I$I$H mfI$I$I$I$I$I$IaAMmlI$I$I$I$I$I$I'+dmmI$I$I$I$I$I$I$͖mmI$I$I$I$I$I$I$qdIdI$I$I$I$I$I$I$0%YmY$I$I$I$I$I$I$'3eNiwXFa3,#X7$iKђl9hF,lyh)QsrW˟"~fS73QK7.1I$[pXXcIG49~xi3϶QnKDԝk ufM,\(kBM,>`6ʅ$M(R$%Sn{a3hi\x^&_6<#jPlU{b="5ݸ/ )˟c]ӏ998r)&e$D3|w/!s|A$I$I$I$I$I$HO g:}w_0ƥ?huF4NHDD@[=``1xXqLJ128> iV$CVq_)<$6j.y Y~ϑ/x!!Ó>F5E9<[I$I$I$I$I&sQI'(rĶ9O叾s)w@Y:NdY:Nt]:Nӡt]:Nӡt]:Nӡt]:N|_:΅|_:΅|_:΅ӡ|_:΅|_:΅|]:΅|_:΅|_:΅|]:Nӡt]:Nӡ|]:Nӡd]:Nӡd]:NdY:NS fGwlfAU -K*~~-/E?Baa?L$~b%u89oLk5}l툱,b37DDaʼn;g[4^k'1l\NhC` j@R(cSX~߳3d_$I$M"/ @xq<٢FSڧ{Nj;ݪwTvSڧ{Nj;ݪwTvSڢS6k9̰zhopJ\{p85YlGJ3cJ e q'M~_\<٢68YHh1BnsY xn3y/g[4CM %TF*ZeZeZeZeZeZeZeZg[4\"H4ԯ6,h9= /6,hOg[4\T rmi/g[4\2bI*$K +iQ}*?ByeE6oDyeEYzYY<٢^}eglfD+>GY4\y ,.pą럴+>G]4\$D+>G]4_Ae^}egh˦BI#KB+>G]4^V|6,hмφM@%>V|6,h+ϬlYt}y ..&ғ/>yeE^}eg`˦%/B+>]4\Hsdy ./J+>]4^V|6,h+ϬlYtzWYY<>yeE^}eg`˦ҼφMk%`˦J%DQ(J%DQ(J%DQ(J%DQ(J%DQ(J%DQ(J%DQ(O ./KlYtz\eg`˦+>]4^B!D"B!D"B!D"B!D"B!D"B!D"B!D" ./J)u/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Ru/'Q#" lYtz[On`pbV̰>k,h;"_bFbw(_yeE_ >̋4F6,h<ɢ$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$MK+!1aA@PQq 0`?SD5OM?3G!IHge<%?!XmBy8i5܄85_8.2'Wf@G_=' ' %hS v`qo)syK\R7.o)syK\R7.o)syK\R7.n)sqK\R7.n)sqK\R7.n)sqK\R7.n)sqK\R7.n)syK\R7.o)syK\R7.o)syK\R7ո̨rG  l8I$I$I8I$$h2ɒI8I'cdT9rI$I$N3A7IKS>~?L,/1mxuz5k/"k>|VeyF_I$I$<^D%pGShܖ)_&aAB$,$*  # 0n7B?Oѥ9zԈ^BԾHzv&FSsfy?gaKA@4#')>%Z( 0Ȩr1ZJVҶ6lm+ci[JVҶ6lm+ci[JVűO3DJ?D?[ɳ1JȮIaBLaI$I$I$I$I$I$I$I$I$I$I$I$I$I$I;"^'ȦJ4-o8^IGLZ$ñ؝v'c;Nbv;؝v'c;Nbvǹ6EC&'9ͪpL&O&K65ƿᝍPK^T:Yūg{¹*ᒓd>{ñ*SЯyxv6ESE-/yxW8ESW+"^TK^T+^T4ɈI~{¹*{¹*~{¹*pB+^TүyxW8ESЯyxW8ESmfm&?BTҭ=sU9` ^W8ESlP'V¹*U0p8"+Oyza\Nq![hGV¹*U0p>i/L+"ϥZ{ sV¹*U0p>i/L+"ϥZ{ sS @ @ @ @ @ @ @¹*hd2 C!d2 C!d2 C!d2 C!d2 C!d2 C!d2 C!¹*=0p>W0p?ÏL+"ϥY,K%dY,K%dY,K%dY,K%dY,K%dY,K%dY,K%d^TҬo%ՎƬv5cXjcV;ՎƬv5cXjcV;ՎƬv5cXjcV;ՎƬv5cXjcV;ՎƬv5cXjcV;ՎƬv5cXjcV;ՎƬv5cXjcV;ڝS,+"ϥ sx¹*TSymmmmmmmʲS_+" sB*ތ#߫"Ȍ韶W8ES$Tݠ  1  # sYy~s1Z ~sU9T-Me>Ps20 03sU9!\NH                    %*!1AQaqP 0@`?wdZ,tn2kb&Z)W5 [ElM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6lM6_JtKT-+*捩v^˯e5ҥa])W Giо\@]x:U_GxSw;|w;|w;| .S!;Ⱥə A[e+J|k3Uo눍QIb PK ːq`,j9.  I7lQ nX:פ6n˝#8@S ظ%YkI}m <l8fVѡ"0sK 7t:"UㆳXܲl[դ9Tw;|w;|mN =XZG(@9yڵU-)8BBAW6?x1jD9qa?X^aJ'?>De JIkf xr%pMK ã*ȗGn&[\z8?Z@P&K.WYC%aD.ȵ* Gہf E:1(t:;ō7x2#WyGGB@jڱ@-ȚʐD/Qб#DT s£".ȼ) t"lNu \ 韴 SN0ӉA7U$Tς ??_k0]zE(4FJ&4Kbw7s?h3wV/?`L0˗/>|fݫ pۗ.ݹp`իB5j&]rۇj͛v92 [t*qQ<̫_bm&؛lɲ&ě"l&ɛflfٛfcX ~/r.\r xHNtM7SqM7SqM7Bn>6f > rP?r˗.\rA>)M #ɯUVU%k@lj$WI(cFQe$0Sx` ëT\tEnAz.\.}!aieag1"Ԗ3ۘ%+ W@(D :˛PP ]ig9sm Y?Mf\m6|XcHqԝװdL:iȿn"FKa!.#N{F?{ XшoKK&+K-U8AAY(U9a:Z JY`rd2y Z@vtӼ3g#C<,FǺpPtpPY0%2%0zܺ*U*<l(Y݁ q#a#"vPB(5S#-ʜAE̓a9a фaыag[E%h]R4=u.\r˗. 6k NЕsVaSv*k$RYjQIȦk`ak]Ld[c>:c*O'Zș;Q+ha;Ō\<%ސU/Oz V+]5HE ]rd,aRpDG4{N0<פ_upY,Vӥ''''''m/WiDtNp);0A`8Z\P 7u Q@:ˊYdՃETР]"܏Q%.H:._; e,-#b%Kp-[ n%Kp-[ nao3pKLP3rrҭbsz0p.VO5L䝒2 @0oEBt-e UK˗.\p9- pOD4S+UosQ[XR8 ćLM]C5Ҏ!7ǥP#ݐ%%d ^kxDa-vӀ&X<[xo3žg|-<[xo3žg|-<[xo3žg|-<[xo3žg|-<[xo3žg|-<[xo3žg|-<[xo3žg|-WB8#@ #Zؐ^(Qm˗.\r˗.\rf0Zab͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,سb͋6,ز0K#$xNIj0\t /0[5\`3;34Ț(ZV#s&He*h?QPbb@fpB9 (앲Xq'+)0жKXl6<,Xl.Up}Dkr˗.\r˗.\±ed'0hbTa [j@@%}CPEDxL+$f(yۖYB2 QI4"yaf 1uo}n*ATn j(G8 a.X$BCXOѢ1Y#[kE֫Pje5+\)tێGE0n @˗.\iT)˗/ǗxFLjUwTN\qD4˗.4/Ǘ= ȅ-SuUEmB cbQ EdvjJ O fРD^2諤/.A,wnX)X*86rrGI韉2epkT'-.q:P5S"nom5Uɮu:a6[+ Ai` \ D۟S$*?D@y_J, xpÇ8pÇ8pÇ8pÇ8pÇ8pÇ8pÇ08yEQJ" EB[[AUaB @Z̞b7a]ciPxbOx%o+zk44 < U+p%a܍`ǎ0PZյVc UehJz{D0zBa T ¬iY*kcGAlb̜2bR&#H6U^ hpִep'ԶoR恼˫FN1l\X 0V\AZ+qǺ,WSEܥ&0 RU Z8?]c1bФh ^,4kk=@b+& |OQX%|?#Wb&UQJR)ENK(5YkZֵkIǺҽ=gb:7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M7o?Sx~M`tmp9balx013/distribution/innosetup/filldlg.jpg0000644000175000017500000002747713616566001021631 0ustar carstencarstenJFIF``Created with GIMPC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((( KyjuGTw}<Wn?fxiyq1<zzM,d[Q^KU_V>[ߕ0~qso1uLB-/z<@@H$@@_$I$I$A @>KgŽA$Q `A ,m @$G^]&6S׋|NPE~lP2ק&6S׋s"s\: m@vZDZX O^-<nzzR{$jzl 0|[ A@Xڞ ON- K1DfY, Hjzqmc =&vzp)!#KOHe$dch5=8:x> N봐QԀ0<9=sDf(asto5{&`$>޹35AvO2 pǎ3o5{G&v-U<[ ^3o5zSO2Nv-UǁAT,S<@S>hDij]:=L xi iV);OW$&v-Uxu\/*2!3 01A@B"4cFS)1ex<x<x<pS\u{r|e̿aMMMMJĥ)4VR5!YN5T|MqKtֻ֚`WZWqM~֦N*J3S%L2TS%L2TS%L2TS%M7#|7'sd~n#Ի1. l.6њՕjY~ r}_Jty-!'m L6ќhOb!s.,hԺLN4.~/}6O}VО5J7Ca!5Ra(S]+Լ/uaH dH dH dH dH \2MzzU^{!ҝQ֛Zmi֛Zmi֛Zmi֛Zmi֛ZWtJ.ǥ;q$HK.ƉKoty NpR#=ݵ+Yu[B{,(|= .^BzS.jʳ*̫2ʳ*̫2ʳ*̫2ʳ*̫2ʳ*˹HBzSк"̋2,ȳ"̋2,ȳ"̋2,ȳ"̋2,ȳ"̋2,ȳ"̋2,ȳ"̋7RT.ǧnǧԺRd 6@d 6@tYfVaYfVaYq…xԸnt7\&S!uY*#o-m}MMKIk\6pԺ]wO%lmV(a zFN6CR}SSQˋR,!MMMKxMZjVզ5iJjT#28#28Yu=?u7Sys9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9sʲ_1Q3q@b !12A"Ba?fJe_(ub2 vJ(L&Gtً*7a.} be@n=FBP 2N6Ms Q@!|r#OE OdO3 '"$dV1,ȧ}!yAD{P f}Y`f "RY3A˄be_d~ cS^+f(DST.]S9uNr=˪{T.]SܺuOr=˪{T.]SܺuOr=˪sT.]S9uNrK1pƜ;u؆1v#6Li÷s +?ҳJ+?ҳJ+?ҳJ+?ҳJ+?^ȉy:dƜ;zӉ7ۿ#6Li÷8H:dƜ;z~D[[[[[[[[[[[[[[[[[[;J#"xDx*$U;E5v$7yTDXh^5%?]$v fSOMς$zM={"i5ڶ5d^0ax /^0ax /^0ax /^0axq"MG5h"G(QG)rRG(QG(PyB(,%D]\4.kg G5dQМ4(?A Pƒ(?A Pƒ(?Ab]G5h"\}xs].kEw<G5h"\}xs].kEw<G5h"r̳afͅ 6l,Yafͅ 6l,Yafͅ 6l,Yafͅ 64:1!2q3Ar "CQa#0@BRSs?dVQ2kV2 Tؕ&`0a5N'RuD&%V`almHIƫI`%Z 6*D5DKq]CIY-|+_ W¾I_ W¾|+_ W`11C`oPX&`z~". \/p_E~. \/p_E~. \LsqC`M /IQeh|Gpݱw+ ȳyV7 `׬h2O;ƈ75 0N#f7*P'T֢{Il`~ɂQvt/qm'(=O;)HNfOi}+{<hS7yIJZ,#^@}t=&`:x_njsWۚ毷5}_njsWۚ毷5}_njsDl澯0M&u_c&:~-y . \/p_E~. \/p_E~/W;n3{]%R>(E0ӳvܬ08{"XVh1=F5qcpM&uu_g5ZbO+Q|YIoi;oԎA{_'Lj'u hH--#]?|==L⯷5}_njsWۚ毷5}_njsWۚ毷5}49{7=c&?{UIW%_UIW%_UIW%_UIW%_UIW%_UIW%_UIPm0pn *ZjZjZ PwUwUwUwUwUwUwUwUwT ~0pe%$#UMsN_[5B]GUQ,ѭl0NoEW5DLꍟJgP4Q» 䨘SJX@?0ը{-qw;n6ACiKDJ;P&F#[Y۩TM-#@5@CgLʏ{w%CP!d|q_c&;i^^EyyW^^EyyW^^EE'g+ȯ+"+ȯ+"g!&?mMRjT&5IMRjT&5IMRjT&5IMRjT)!Q1Aaq 0@?!#BNLZLXuohNҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸM+ҸLZN MsI.- nt4nn|@0f{M-TY[A1~Hd @KtpO-Pd#_C.vI-A 7J^uTvAm8V(Ѥd`F YZ‰;6;ɡ0x5=? @hSԀc#lwD8 sSN(?@0\d(/}5)^SF)xf&hf6hf&h8h(h8h h h8h(h8h6hf&hf&hf4Y?ӧN:tӧN:to^y)ļ^Jq/%8IN$ILIN$rSqN2)ĜNJq'%2NJdNJq'%8KLKɪ09W :PsM>UaVUcV0UcV0UcV0UcVUaVUcV0UbEVU`EP_W `D vndCfv%Po(cX !! 1#cx~ΆznߝO'/1$hda6{ 6 A4y18$IM}P7Ŵj}ڦ7Er/7"kB@ ;,,,"W܅앜YŜYŜYŜYŜYŜA!%YkܯS;΋>X;,蚊GڱXԬjV5+JƥcRXԬjV5+JƥcRXԉe~t]*%i ػkM$G4QA1gnܟq>F"=bAQ<_KAm/QoܫԐBD !78(L9=}2BOth*前-7Ab=rmo0(/Ђ$^V)!s1pȘƖ4,icKXƖ4,icKXƓФ-?rVt,{n%CW+JqR\T*W+JqR\T*W+`BWi+Ouhb.! 4؟PGqư;r}R{CX*%q@EL`X:u`X:u`"HUJ'zErDrM.jrE\QW(U*rE\QW(U*rE\QW(U*r=ʻK=ʻK簆tWI]%tWI]%t6,r++DJ+DJ!oWi|?/Ѿ$ٰA;&> Mm88 ݊&7@_ 4<F$?ҭ|n`Mxh[wo?BWi||z1pcAs;9 4 "YNLMBq2ѡ> A 3E#CyG ]Q_W+E~Q XF˼]^TW+EzQAK],hV9(=nJPλ!:;\΋Q|7O,;NhL11T kF]Sv GXb$ױ!F64muz{jsd9*Q;ah80xa擥'KN4.h:\tsA惥K4.h:\tsA惥K4.h:\tsA擥'KN4.i:\{^o=U<~Vm$hl~Scf6kcu[5[٭6?)Ml~Saqێ~VZI'ɵ㟿U?:m~8oN2M ȕɀ 9E[.w?H~~    #៿U<㟿U<㟿U?DI$I$I$I$Hoȹ"     9E{.i+ߑsO.9E{/I$I$I$I$Hȹ"堂 9E{g'AA\3_S៿W?TI$dI$I'~^}E{g .ܼzXtc]ƻwK5,kXtc]ƻwK5,kXtc]ƻwK5,kXtc]ƻwKCP6̷MV;p6wĤ`IU۷Li#ֻ;K"C,WDUM2ak @izxI]7bPvCy-'ҵk4Sm h-YqمX8OK氼4m=ji$Zû Rt>~d6tV3ErP٠hY~U}`%4y x.ۿlKx GTCSQMvѭttmRñ F_SZ97k@w[Q˞*˗.\r˗.\r˗.\r=0|m.\r-]ӭ!뮺뮺뮺뮺H5s`[bXRԅh\eA]25\K0(˹ҟޥˏWHʸ@]ej cJs!W 6sr%UpfEhӜMl*5+h qa2" \tkc>6@%n6"]ZW 0}.\OAp]2UڰC}iP((((((mtjTRJ*TRJ*TRJ+r~rwѠސN/8N/8 v* (/cg?py?py57r~wc|e^@ `kePB&f%Uf*U­Z%HX^1 -d=ޛ{(ZF75BԛWwv+-7jVp%@),k05.h6Sނъ ~_p]?;hDuR?i{H(=LU\kv֋];%-+5.v4#* a Cte)jAEĴvyyxک$DFi1QQq֫Je KRuQEQE*hHFD~O;{{{{{{Q{Qh[Ukt+eur @ @ @ 4A!Bw^tmp9balx013/distribution/innosetup/.gitignore0000644000175000017500000000017613616566001021465 0ustar carstencarsten*.dll *.exe audio bearer iconengines imageformats lang mediaservice Output platforms playlistformats printsupport translationstmp9balx013/distribution/innosetup/24C65fuse.jpg0000644000175000017500000003170313616566001021565 0ustar carstencarstenJFIF``Created with GIMPC  % !###&)&")"#"C """"""""""""""""""""""""""""""""""""""""""""""""""" Q.s}vetz?'|֝WiuQ6_5ϊ}ϿPŞf)ʵ9:9%=UeDwSw?kSw?c|+؟GX)&,%1GDy_ nߧ^=>N~}A Hptqf7tUtI$$I$B|ADank]$ $@!0 AD>g[ w;^A$@*$@ zkangk]]Nc 4U- amkU2<;X9 >j|̾ |v0Nc@ >w[ k;^s%$|vŵaiyaQTZTZ 6ωhb%evLzMPQsQܑ#"@ܟ?7/,Q8Z:rkv8"q5us,ز`"'=[O7b^R^Ax^P^krvS1.#[O7cwdE扊vJKOFZ >姣@%pek`fY]Cw_`'tZ:YWtH2tv&+[K7cw@Z:Yr8Sܘrtv=p r$3d8ߟ f>pD'+[K7cwy8JH$,)+5@9$k`f{ODѕ+[ׯ>.O,3! 24@"B#01Awa xg˲.˲.˲.˲.˲.˲ r8hw/:`AkQoij` X؍d9 K012D/f߼]`;jkZY إ@/a 9M&[p;聵"T\>OK9kWuuXkYhՍQ%"Naƨ<2G*sڠC rtB0j#7LH|V+y|bS[>޴yZ(j`Ҩ;mV qI D({FAҩbVFjqQ$TH3g0LXDijg%Jث9aY6;5~j_$xےdԍ1ZFr""u2 j#jH]]]Q8L4(8]]TqHQ-FZj2eQ]?)SYNe:uQ'U?UF;-|E"o[-|E"o[-|E"o[-|E")\1Q3q!@"A12Bb a?hTKꩆ_7TDp5SJi,2wbj3Czb:?),<ܳX: ^HA=:613*$.IQ -q)йA3(CkWY$>@Ey8}MtI^?~Ȃ X9Ko fL}ACqTILtO>B\fP$uW}^)"OӢ1yB$GC&-KcF$..<>Xvg6X}&;TlMwٞa[=aafzenþ5݇}k E4,>v5~ҼWJ?i^g)LXl-v>8enõnq4,>vb6u]yW^jךu]:#bk E4,>vi6X};Xl-w٦a[ Xl-w٦a[Maafd+qlN-ŰU8 T*[S`qlN-ŰU8 T*[S`qlN-ŰU8 T*[S`qlN-ŰU8 Gr+Qq3@!1A b"a2?&BjOW f'Ȋ!UCLtպ LP{O9rZPG%]&LpGGCP9ܠTq@99c0t>.ArSBr] A#!]率zESCFLB$~5kNj(%kA PCH ^0^Ա+i񉟞k J*쫛nʹ*쫛nʹ*쫛nʹ*쫛nʹ*쫛nʹ*쫛nʹ*쫛nʹ&YhvSۑg9OnEvl=yYhvSۑg9OnEvl=yYhvSۑg9OnEvl=yYI~x?`^/d9휧"߬~M}㮇l=xckt;g)ȳŊN;TYSeN吀 l=yYhvSۑg9OnEvl=yYhvSۑg9OnEvlE#5BʡnPr[T-ܪU w*BʡnPr[T-ܪU w*BʡnPr[T-ܪU w*BʡnPr[T-ܦ = !12rA "3Qq#@BCa$RS?2NR/0YLaWpWpWpWpWpWpWpWpWpWpWpWK2TK")ɦ78aMMSTU"zMؘ 074 _ж;DQ1U=ls{SS9&J!q=jJ_"r{+/$Lɟ=++)F D:G휗T7휴<H5coQa {q[z`+-mz^pcѵXց"$?*0҈y`:{;N\dE"D(pêjhbiT ۢV颣M斿6*u ۠8ڱ1bbʼn&,LX1bbʼn&,LX1bbʼn&,LX1bbʼn.C+r\W+r\W+r\W+ 2yBna v.'"y.'"y.'{%772yBnaD&!&t[]e;jӕR&* iv4>:YBdU/ƆVio~ڃjzĉ'mw7T<30޹8P:kE53D^{,P%-1#rjK 2trW h q,(t͑p!3?B4}ƂTYr8~A mtU#1$τ|Z~l\Խii?IPG` L#Y?=WЕR1܃wBMBfMIJ\w8Zw+ iM0f:U(L73+|V6mXⱷImC72yBfaoceL3 (hKu1D;Z36Ke`ȾgO.qd:]6ks㡹S28ߦq?>E͈ac X[ 3_n:3(P7㡹S2fx~pX.]cw ?K,~pX.]cw ?K,~pX.]cw ?K,~p@2g9hnṬ盕3(MaX|5aX|5aRMK>k>kim2ܩG?,CIkr㵴!ڹr%^* G)ۑa.eܜހs6KB$̖ NJo0Bq 5̍1@ ӫY`snṬr4RT>!p4A@h.6KRli̦XsD C7(wb_$W&"vcs ʙs"ׁׁׁׁׁׁׁׁׁ3Rׁׁׁׁׁׁׁׁ↰64hnṬ盕lW5\sUW5\sUW5\sUW5\sUW5\sUW5\sUW5\sUW5M)!1AQa q@0?!,PMCD0NmhB+F ]E~h4_/E~h4_/E~h4_'6DT@)-r,ʤj>KL^E*K@k D`t$#4p4r&P*0 pXr K峄՘<8-،PBI^U0¼$hK=H@]%L!& "B j/nj7@ N€+ŽWtP-"c/h~VvaD`j4@T"m KBP mN1puWl$!s.[Af0\AP9b-5wS<6}`LK1ߛE.1۳h&,2trI'0tsI̝'*trI˝'>trIɝ'.tsI˝'>tr'I' tsI'(t<'Gqq~qqq}a `w&d;fGd{fGd{fG&X{;;;;;;;;;{{fGd{fGd{fGd;`  tfnCqqqqNrDO͎__ٳ&!x3<ٛ@I2$>:o3tnAg$ W,AHgSAcA33r}Q'^W<X _GpFɊR(E zwL6ab P-HX^jȯB`b JKTm`l4P d[.w%G8:#\4x4Zئ*f&:Ae|gA{ 4ll@H/|t+mbnѲbVbC2@ Ѳ`'ͳ6?9G¯sN 84ӃCG^o33pm?g6a6k7oY.!,:37&\Ҵ AnDz Η5rk͌&`7QMa6ٙa7Rkr c m3&u!↏m\Y7Qt&£0":bQz-;Q_h0sTH  L!pEBb& 8Cm E]gSsx[@d9Dºp9}BPm!l5IycwYa7s/vG5S_yNjsSM=AffpǠ3p0bM<<<<<<>AQXBMfnuYSxM7o)RȾ⧾o|=f7Yzjtffᇬ{>m4ب~Lp 8MB6 t`GA xwD$m:kom8=c_H*LvQ-ܢ,Cu=@l^#6E ) @pXFC =t˃-(ˢk DAPf#Dڀl ADG fnzN!%QEQENH7t,Χ|< Mfnu{:8sγ:8sγ:8sγ:8sγ:8sγ:8sγ:8sγ:D [mmm$$£(N)]$vYeY$Y,[sĒ%kY$@@0ߢA A#~4e2xGmm-̒9ϭKmml$%VmlI'e’I9^I$I$c$I$I$I%v EI$Id^kYeVJ$$I$I$6$I$I$I$I$'mmmi34̗*K3%ʿ=L٢dI(J%=Tw<R Q횦Hwr-+5L6ϳsH}5L=T I$I$I$I$I$I$xl2\S%lK%dY,!dY,K%xl2_7Hw5L=T|   KAA p٪d"W<;c:c:c:c:c:c:c:c:c:c:c:c:c:c:cQg~3)!1@Aa Qq0?ه|h `G =HXA0kA$bla u#w M!g;Ju |o 1`1>tL7/-S,K8@E=b%f%3k4J:zD#o!%)ԴhڿA H Vŷ" δq N$|G>Y ߏ~֘q b$4DPK20x@8oB aFDF aIS= Sk^ةmдm4[]o%uW[]o%uW[]o%uW[]n%uW[]o%uW[]o%uW[]o%uW[]0{SJ秔 iT22dݓ4Az(ҹQz(Ҩeqr&h|_9.HQOߌo7c~1ߌo7c~1ߌo7c+Ak}O.0ݟG]xKZS8x㩦v y^1HG\^ ax> W-/#CYpԒH,/"^qs2"ao96I)gYzRrAN$6Od¾ؼI H5O~fNτnV|wyNXxĄU_n?7̄DOӏ<?aN\duPA8{cS *do8H=Qsv;,0YPt~JNծ3=7.7%_Ϯ1 .^X˷.rы6/`@5ZTT| qai뮸8a|o $^C8CÌ8ُ1{_5{_~5.~8?CéF*rX<_0P go)w~@> A~`LB`TC^mﯾpl-T7bJ"+b_m@Srd~P#UaSRqm9'y(q+ŰIxeXNRsbO@V!j Kg@Fj8+9ͱd#zpa118K-"e]S7_}H.x/3(I@18KBuy5WJ/on^i/)6 x#yS0. O4oYKPX 뮺뮺뮺뮹 rӿd.˿|.- `k~ˠ뮺뮺뮺뮺뮺뮺獻xspFi訯$IR9-r0@!^.jd'cźx7 xx"iA\"!B3e=:﹮ `YN.`uHVF4OSuŊ#E\l 3un. 5r}H 8Eds+xb=X'k~CCCCCCCCCCCCCCCCCCCCCCCCC *'݉!_| -_񪪪4|k]oݹH @3]cq.:!AФ>0BJk: m"8y>Jݝ r^Y`GR驉z~~y<!MN=) گʦz/$蜆#9١傃3 ұ P}ם@iZfb܁wU/.aP.n˹8y#έZs`((*', Dr,=/ {{owQWx~׶(+Qsr˗.\r˗.\r˗.\r˗.b!*_]tmp9balx013/distribution/innosetup/prog-note.jpg0000644000175000017500000004030413616566001022106 0ustar carstencarstenJFIF``Created with GIMPC    !'"#%%%),($+!$%$C   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ z',wˆ~gW2Շ] [|>oY8r91xVbLixwGO?&9f-[zܘlupXSdn_]q65e,/UHF\vVq'yb-Y匐oS9,o@ $ @\>gո&BA I H$"R@$&L BW^sU{VH$A  @ Aw^sU{^@ؘ A$A@ Sfrvr56 C1ei&C`;GHч93=u;UW5iˡ spN72 m4!J'uW5Df."xW^oU}V:9s`iD.V& g3K\46sP3(\c;w>?T{7ԩڇ0X6Xm%Mm&}~9^oS}m{f$ BPrnNu@,rN7ө7M̉O*op24LĚǤnufpO*op,eTXSs Uכ[^P,X]yM8^o Ǟ+!321P "4@BA$R%N-)2ix<x<x<x<x<x<6]U~5RWUkU"U߆Ekfi!aܹr˗.\r˗.)4\iJ]BRqx|Hzh ܯU˗.\rī%UUFkE\Bj`˟"[T.+ث ~JW.\r˗.\r˕~謪SZS#¯T[܅U ޒrr*˗.\r̼\WTܹr)m ~&%l&N^׸u{^׺u{\:uΝsZֺukZ:ucX:ucX:ucX:ucXֺukZֺuΝs\:uΝ{^׸u{^׸h8h8h88}?ܹr˗._3/B/B/B/B/B/B/B/B/B/B/B/B^н zzzzzzzzzzzK!W[q:q8sN9ӎi4q8sN9ӎi4q8sN9ӎi4q8sN9ӎia%׫fT&3JIaNy#86sELG5.sK).H>B߃ z)Ql6i y߈0cqh\6\u1q,>"|{&BW_Z]Z)^mƬVA Րj5d YVA Րj5d YVA Րj5d YVA Րj5d YVA Րj5d YVA Z\eUI#O:7'6k) K|3ַ<NyV|z6W&2qjE&T3gKi(gǢ6Z%?ٟO?J}nzr3a&{68Av: G^&A*G"tZn[:rQuP\4a#UHe~C_'ܟ>ąG`Q(v ;G`Q(v ;G`Q(v ;G`Q(v ;G`Q(v ;G`Q(yHUDr~3Qf5Fj3Qf5Fj3Qf5Fj3Qf5Fj3Qf5Fj3Qf5Fj3QfWO?OFFFFFB)c^쌌bO?O1qO"u{krD3X˗.I} 2ؖI.Z@좟T)e"MkI'qgqgRM+K Ʀ51LjcSM}Mj`(F 0Q`(F 0Q`(F 0Q`(F 0Q`(F 0Q`(F 0Q`(F 0Q'ggggggggggggggggggggggggggggggggggggggggggggggggggggggg ֪3 R3Qa!Pq1A0"2@B#?IDB8|auP8rm8pI9((t?DCf$LC$SzD+砣NE4JIRH*-{I"2P~T$%,=9[da9=6_!lQ|سu $q qUk8}=Dgt"JMGQϥb_a.j?4(mF]C' Tj8&JS.(xI([8e}| O({QzzeI/mO1WRӜRIQ[̅d.3!u ]fBs2c̅d.3!v9 ]fBs2c̅d.3!v9 ]fBs2c̅d.3!v9 ]fBs2c̅d.3!v9 ]fBs2c̅d.3!v9 ]fBs2[̅d.3!u ]nfA捥1GOu >|xQ?B)|$.OP'w~: > (ΠQ%~u >|cl^*^u >|cl^*?^u >|~ ΩDWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNwdWvNR,=i|$u >|w~: >;zS(I?B⟎GOOP'w~:>t%;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CǸ;1-{CJ5L+R3Qa!1P0A"@q #?UJ_{щW F"Ǘ*1_5h7ܚLև9q(SrUh ɑCȴ3~Wg{ ZTPV%huQ=)}jULnOw|zyo51 OG|D+V""%8=Q"AE WC-*$t"Hey)OOTj"|ˍ#c嶞աgpkgpkgpkgpkgpkgpkgpkgpkgpkgpkgpkgpkgpkgpF{q!6Bm}ljێi &n;n6q߆owێ5c*0q;1a wc0q;1a wc0q;1a wc0q;1a wc0q;1a wc0q;9j/ێi &n;%E+"I rX1I,oy>[&3h-Tns8|9Þ*#nb l-%Ig@O#7a.!7k3v62e}Rq}ֶ Vfo]SE+n/c]A;(Y;ZmHk˜mMX_CK0$hZ&f}D 4`a-*NhLkOmkqxڙ/DIkL/BsSڱ .2Ha~$a4XNjř3f,Y1fbř3f,Y1fbř3f,Y1fbř3f,Y1fbř3f,Y1fbř3f,Y1fbř3f,Y1(ɞPeYBP,e *ʨ,e (YB93|Di+LZf4V7Ei+MZntV7Ei+MZntV7Ei+MZntV3Ei+LZf4Vh3Ei+LZfp_S<7> 6~Okv= Ê!pٰ])ó[]j#KLL  u;9H .ݤ]ncei/z'q#a_mWOD?LHe3zCv10{6xX|F2"GMca1߂0"F{;8 w I۹@lX? "wڠĈf6oL}=~NL0n q)͞ ~ 3 p5>TX6cllv'>'Ʂ'{ʅk6..5qXɟGrϹgܳY,}>rϹgܳY,}>rϹgܳY,}>rϹgܳY,}>rϹgܳY,}>rz aYeU*EVhY4UfU*EVhY4UfU*EVhY4UfU*EVhY4UfU*EVhY4UfU*EVh|_S|3>;9R [0v}9(7 qw0胚f[Df0[g)/dhd(̅xxQ@cb8> 1{/d(Ot~>UxL#89a$5M'&,q nH.sq`;N݅ }!p;=S^fÅ ~+5t轓.صhGP)n aP.Ô`͓=fC0L&ZZ" >yb:B#Z[\*`_0slzcĺ\ bfў%(DC:7rH1lTV q\0*d(=o'e/ =Ȁ{hS0:O'-c;ctCB׷ 'Kc1hA?q#1 gf!č'8wZ8L[#.\>>s QM0n [fhEZ*VUhEZ*VUhEZ*VUhEZ*VUhEZ*VUhE4™Q&BUgYVx+<|>J%gYVx+<|>J%gYVx+<|>J%gYVx+<|>J%gYVx+<|>J%gYVx+<|>J%gY[D}>Q&G.Kΐ&LϨ}|}"Fш=f}fFa16A1hb蒗FIH{fY_uuC.q&[鐠HC+x)-o?ۨ}|zuujPĶ5!1"[ Y  mz|=~ Fa00ՠlM%inM|G+~rEʹ*_~rEʹ*_~r*_~rʻ*_~rʻ+ği>D(TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGgvWUj;Uqګ\vWUj;Uqګ\vWUj;Uqګ\vWUj;Uqګ\vWUj;Uqګ\vWUj;Uqګ\vWUj;UqګL*!1aAQq 0P@?!mZ8l^!&qI`:i%:!hFNv:rMPt1` tT4W*qIZui*)蝅]5]D} vڳX%:E h7QT ޡ*wPg< zÏѧV+Kk&𮌢D24PfDA[z1`t]=7YN4h#"[5zz~ԠMIN]zG!SL t5b)++~qSTQ~d SrN5ʝFڬau2h)Fmo\nf]kg(AN6*&gUM69*h_IY H2z$i5l;c(ev3a;c dñv2.Eʻc>e݌v3}ϻc>g݌v3}˻wc.g݌v2.E̻c0dv3q;Gc(e㱜v3MiI$I$I$I$I$@ $I$I$I$I$Gv&͗ d̃w2a;]͇.Ǘsc˹lyfǖlyfǖlyfǖlyfǖlyd;9fÖlyd;yfÖl9d;yfǖlyfǖlyfǖlyfǖlyfǗsc˹lyw6<]̓w3A;s :(Gvr4qe(B1c9s9qc!JR)Hܜ:za%' wLACImWfMZM{md4EbNi9C;5K֟P.Z ;/P]D!g&h O]5JFHd.J馃O_)>?t' 7Ua2rr}Jk RRi*GT+bFr)I%7ס݃4Jd/)ZuXv83sE3DUѤ5EJ)9,BG)2ZpʔAH(_Sp|#; I$I$jD#qp7 qp7 qp7 qp7 qp7 qp7 qp7 qp7 qp7 qp7 qp7BUTCOA$I$z ٛ\ͮf3kms6\ͮf3kms6\ͮf3kms6\ͮf3kms6\ͮf3kms6\ͮf%?R}͐soz72Z,vEuVtHJhO5R6(Ap$$ZƪiЉs֧RHY(QEe*Cz(L1$'V%QNT"J ?fkaމ%'\7D{㞨yM}jQ9DT$T.hU= CYYD'ZhRmus0uC^ǧ}a@tG'Ha+Q.!Az iMz]Y$QCiO6c2&tDnᦰ 3.q4l惑äzi룅R=@d*Ih$Q"zȩD4Kb0DX&QQ.P]6PCDܦR6֡8qԅţԘa: ] >'#;g MW3y\+sRI$I$I$I$I$I$emk; m-X@mmbmc"$-[%[dKl-!Z| ˧5Ya _mTA @ d$ H$mKi6ImM$Ipk@I$I$I$I$F%H $I$I$I$H`ؒI$I$I$I$I$im`N$ AI$I$I$4۠A`I$I$I$^$DI$I$I$I$I$mommmmI&I$ommmmm ]mmmmmmmmŒK$0mmmmmI$Fmmmmmmm֭mmmmmmۿ)!1AQ0Paq@ ?j>ݬJ̊!HhGlN%3| I)Ѷ֑Ng$=Go-uLE`nQiWueS})G.\+Bkhޭ(Rȣ-)f#mKh#k=$IRt}*im͵)TlIΪ:%?zM;)ke1aGz{xI]{;K&ָ _÷ @rZQծOm=Ts918)&DI8^Pscr'Wx|I$I$I$I$@Pgx%M޵kjZNw[γ>-NIFsO?rOX֓ڻ=]ehN9s֏ڻKINS]}C⷟.I$I$92$:Rv$LGwu]R*2 JO_c;3g;#e;Cd;Cd;Cd;Cd;Cd;Cd;Cd;Cd;NCf;sf;3c;ea;/Xl'e    ?˰N~v# ~v#)zbld?"D"B!D"B!D"B!D"B!D"B!D"_ vC(N+=?(ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝ̉ȝŖ#ڽߎde;!Ufwde;!GkW_  oUֽZ1;N1;N1;N1;N1;N1;N1;N1;N1;N1;N1;N]SQ{|6[#^*TRJ*TRJ*TRJ*TRJ*TRJ*TRJ*T6[#^]!6[#^-/A~R6[#^B!AB!D" e$I$I$I$I$I$I$I$I$I$I$I$I$I$MD%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\9%Is\$*a!1APQq0 @?R6 P?LD?r9_ )R Sj>X (Jcc០e`LeѼ&:?82Own2M? sQ8Zt/}c+z+_OXR_r&VqȕI6'+Ƹ GF3y+GGŪxfC |O1r_ IgL15*Jh #C0'q(TOȹD(y>'qz~d٬q n>0i$majp7Q'@j -yj|e>F'3yyt8]Wmrk\v+]Wmrk\v+]Wmrk\v+]Wmrk\v+]Wmrk\v+]Wmrk\v+]Wmrk\v|/n>囇H A    #G   _{c囇^f/$I$I$I$I$I$I$I$I$I$I$OMܵ8:Վu5cMXjSV:Վu5cMXjSV:Վu5cMXjSV:Վu5cMXjSV:Վu5cMXjSV:Վ6xg>y|pp囇ȼOp囇ȳM(}Nbv;؝v'c;Nbv;؝v'c;Nbv;؝v'c;Nbv;؝v'c;Nbv;؝v'c;Nbv$p000000000000囇ϼrfRI$I$1~'7kbO/n>I$gfRI$I$I$I$|fXZ(4E"DPh A(4E"DPh A(4E"DPh A(4E"DPh A(4E"DPh A(4E"DPh A(4E"DPh G)!1AQaqP 0@?tZ YXkƱ2έh^=H-mO1>>>>>>>Źc:+wwUCkr]!mw@D9Tq߼īa"}VrQD*DzU㴽@d![rݥS.zJ lFcb͇Y!Jϼϼϼϼϼ73>#lNϋydBv/(XXG_}3-,S@=̔;)#=SMi_6G+2ŸEcA _'Wg |v·}42(~IO)` O.n ^٭{@kRel(@EB cфѓ/xc l4Jdic\*n0p&;ZL~o݊f1X֑KaGN׵-GiA!L)*XXz>OvHLo_u +L!%` Xb΍:V-v˗nݻvۗn:0bݚt  )iV;%˗ O,arZDDcvX?Ӊ)RZkml͇s6f93`oͣs7f93`l̓s6fyo>?jթT"!COĿKna"˗._kc(v( <xIŧO-N謁Zvqy:&F 0H9=nLX·= v !nvWfJJч-UpQLj]dn:2@ ?~R g:>KPՙ,chm(N:ڍL!(#2E-aq @CR,*qKYރJTg@T}Q9YE8 &sE6-P(o"՝+*ic{B9Y}b=mptFV֡# ]C4&rW-Çp՝E4z*} [(*Vo ֬fxal|ϟ>|ϟ>|ϟ>|ϟ>| cǹ/JuZ6?YZ>'L3Γ:L3Γ:L3Γ:L3Γ:L3Γ:L3Γ:L3Γ:L3Γ:L3Γ:L3γ:3γ:3γ:3ckV-hty'by'b|Oϯω>'|O?3~g4>NdO>g|?3~gΔm~gʋP}F-K{ot[*(S]zC7iG&Jyv4aWeC XѼLO r UKvR*R,E&R(=rݍR"*K}iƒ="Ex@f`k {u?>=`o4Gz*)"C'aRFF;ƚ;ua=l0??c%? ҾO,~yxK7R L2)XSz%J CD93tns7fr0X;O`c7nfݹ3vnۙsd-١&hI&hI&hI&hI&hI&hI&hI&hI&hI&hI&hI&hI&hI&"E 22@ =s4Nf9'3Dhs4Nf9'3Dhs4Nf9'3Dhs4Nf9'3Dhs4Nf9'3Dhs4Nf9'3Dhs4Nf9'3D0)Uvtmp9balx013/distribution/innosetup/license.txt0000644000175000017500000004307613616566001021666 0ustar carstencarsten GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. tmp9balx013/distribution/innosetup/at89s8252fuse.jpg0000644000175000017500000010662413616566001022360 0ustar carstencarstenJFIF``Created with GIMPC  !"$"$C& 7uŎ#; RϫC. S?>Ó'tg$,KVq毓^&z7ȭ yzppg,&럱}>ˆyӓ5bknz>gf,=|S|uppw{<5\bɕX_#)f]~l2^lS.}}א2>-cxE  @ @UͯGgpH$A I   @ 81g @$A @_݋=LA0M  @ ~*Y07 D&HD8U]سSO@lgb+ P @r:۱g^݋>E h7I&&`Tr:۱g\V7t,j 霣aAuN`l wy3њ"NOC{S{v,$Ѡ̨Y45 f 3$ @T*Yky^݋<,mWTWC{S{n,ԮX)\`uJ#d,*Y=/F-UlY̮I(qw N92WC{S{v,ԮX(nJ92_CwS{v,ԮX1 Ȑ,*Y=?F-U(Szp -(J9UMسzR`ƥ&5Ph7JàX Qǔs:f}O5&&q/7ɹ|Ur^17VLbT$f=oCsS{n,ך;dYwCoS{n,א9U(OPszqgICoS{n,אc=Aromşzprolşp9UM혳{^@Q *֦Y= (zCkS{n,אcPQrjolşzxGkW{&ήxseQ#}%ij`&i96uwÜNP噚%Ae_RMF :eY$`[ԗ|"=Trl8 yu 'X*f,՘]ꂵ`\* _4Vd GVCgW<9gfD$JĐ$+)p@kSɳ $ SrwOY=03"24BAP !#1@`$%5Uc"c|/tb3=;t*ע_JtpDQѲ˗.\r˗.\r(S֣k!G.5FtbFJ>G‘_5D&#k[E~ιr˗.\r2ʥC.,J*5qCQ:qށXiV^KE!B\=.\r˗.\r˗"cTsj_*Jf GN RW9ɸp6nJ#uݜ3&sf)rIr˗.\r]bH.\I:MȒC+;|ocLv1ۦ;tncLvَ1f;lmsNv9';dl퓝sv9;\kssv9';dl퓝sNv9f;lmcLv1ۦ;tncv1;|o| }[ۘŦ-1iLZbwu^ oni(":V>+5wܿc]%#Q?Nz9k_u^ onߺ`8b*}lŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜ~WۯDXa11a Xbņ,1ai=1a Xb ņ,1a=`6nQsqa Xbņ,1a Xbņ,1a Xbņ,1a XbŅEw;N=ۺUK4ni3{d[x%zS5Sjᖲj**WH_=%UtΧBbZ:t2ҹٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸٸDS'W))JW#M[MQ4Պʣ]ERqz ivB(4o_A IA.H'nA򓌊Fz8UCS1V=aUKS]Y>HY;P:ڊڗE+f}o_AԸ IA${XhUȭJ'NS$U4,X橣թ^D~>ۯ\p|zj)?5[u.8~Rz=j vDCSkz8G76jKYIS7F~>ۯ<fb s;YzV4 ~YPVM#$1(]'QGXGcPSOыswGpCuo~z|NWo_zq'Wo]z'ޖ+;6>;BY !d,BY !d,BY !d,BY !d,BY !d,BY !d,BY !d,BY !d, _LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL[31S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1S1QZo8J؉d&XĨjױ))[%[Y<7#GKy<͙? 2~uD4BUSM=C.LcgRL৞zb('e< SBrGAeg8кBdHd&4ɦm3i f6͆l3a f6͆l3a f6͆l3a f6ͦm2iLdHdкBKqUԺR]Ku2qd'8n3qf7n3qf7n3qf7n2qd'8Ku.ԺRsIf!%c6F6(cQUk\k's\ߣeFVp3 E/KgEv&ו{ډe.E9͢UtwvAN.^WgiŕLvMoN_)+iS&B6M+}ڈ钺Oa2Ö"[Cwz qjJjL"Y?H[45kjQJZՑP,[Ӎ%u*40T  s*Y:Z7RDJY*-<:y!u N i tnm+)#$^ؤ]#VyLO=CV*i SIM~x$r5V:)HV*g8i^>ELqI%4y8e\ѾEeCV=տ_IY1sLجgg8Nmd6Y Ck!j+A4h5"YHjRrw.-jg$uL |$}ROu:v&9trUrzy][C:YM@[-˝B'N:v=v71˒\^dcRXQї& _rdԅ쪖im{]vܸ2fDswNn97tӛ n!7M&q Bn!2M&q Bn!7'&cSq Bn!7M&fcggsSSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1LkSƵ1W$N73qQR`!1Aa"02@ #BP?Iu%‹ц6YG6w[(F$ک;u`M @!$_dԯ`IJBIF̒]>P w#O|8G ؑ}~ҒWQ1/U܇˒Q?`1`IQ0dHzBaN>pG$# b?hl- ~a5A' (?1F*W61"4y$/"34Ko6Sg]NqfpQk235h54k8왴4m(6RG+?X-*'"n}Q@|,Mԯ\ Y75X|&'"@2l]D{}Z+0~1Zj?#Z)b"ۛ ]uz?i%5̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s!(k C\JBP25̄d% s t(õXW;QE1z%~CXW;QE1z%~CXE ZjnVpO/DvbbJj(v&/DvbbJj(v&/DvbbJj(v&/DvbbJj(v&/DvbbJj(v&/DvbbJj(v&/DubbJZ(v&/DubbJZ(v xJZ(v xJZ(v xJZ(v xJZ(v xJZ(v xJZ(v xJZ(v xJZ(v xJZ(v&1Du8!ւ,_??/cJZv&1DubcJZv&1Da;RjVdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq2vո;jLn&Nڷ'm[Vdq=lȒ53Qq`!1A "02@PRaB?'!F~q sjiO/N= pOz& w%ñG'1Y~Rf#Y#=u;P^r/8hs؊.@fGGꋺj!e.]8?B1^:# ]mE2s')asn(>FNeCd?%-}Deq{Z%]!@z"0E @w]P(|tQoEO録Q؁#0WH{ }z4ʜa?sn9-źBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBV [[t+qnn-ЭźBS>.د0_aMbæ'~ M6O͊ 9^xHQDtdد0_aMbæ'~ M6O͊l&4?6+L:i~lWtdد0_aMbæ'~ M6O͊l&4?6+L:i~lWtdد0_aMbæ'~ M6O͊l&4?6+L:i~lW'M6O͊l&4?6+L:i~lWtdد0٦_aMbf'~ 6O͊ l&4?6+L6i~lWldد0٦_aMbf'd l&4?6+L6i~lW%ed2Y,L_&K%6O͊ loE -Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Oh?E~D-Z'Ox/Q_E!123r"4AQaq#@BPR 0`CDSsbt?H lr_mn`CbADLX SR `FN&]tv 87c6NVl&*oow }EQ/!T `htI9X\o}nutUO|&q%Ӧfw4@6]MVw Рϡҟv/jZMtf"aS6׷ ֽD 9 MMt)<:ۨH ǽ[D~O:SA"l8KۉEJdG=8PL)X'yU8D"j>픟lVj7ytg!#?-4U&2Fldi5lTThb5X|3#am2= MڥKgM3ELI}"./ӝAh(U j/uiYLH[[+tAmwZ&1bbʼn(k5 bCXP(k5 cc5k<8ypXc5k<8ypXc5k<8ypXc5k<8k5k5 bCXP(k5 b1bbʼnsMCF(|!%rW*]wUʗYox=oɍB--_+yk 0tA .##vs?C Cms/eHnl)YaZDAcSӑ1G"#mfz>agFxG3x>9 }-O?wpx,.avK X]d%,.avK X]d%,.avK X]d%,.avK X]d%,.avK X]d%,.avK X]d%,.avK X]애ox? N(|!7sHManK rS}  rX[ܖ䰷%,-anK rX[(pX[ܖ䰷%&  rX[ܔ =,-80i%U&S|sC72䃚A%,-anK rX[ܖ䰷%,-anK rX[ܖ䰷%,-anK rX[ܖ䰷%,-anK rX[ܓH 婼JMY-GO5~k6BjlWǐֳe!dg;&QGBOf.q|dGC9aZOy !F  0Z;7DPN3A.VҟA ,JU91#} ۿ2ES#J%&%.i4Ŝ8e>[r"91H潳ډ{lDeF"tgҗp7j^" jwuCCt$tKH ?CI]j`U2ƊlYgkenkKѢPC:FݱW:RwBڴ7Fcdb"E1D8gb[Y~L 婼JM55@WI3-ś_MC/ZW[0K)Ȍi0$C BiIm6hFni`@A!؃vm5.մxUuP'5&6ak5$6n[f"~-F+`ClC{m*p!S-lS*8M,3m;geW&f 2`:^)2ā nNIpͷ ֶ@X 婼JMMVtպj5nM[Vtպj5nM[Vtպj5nM[Vtպj5nM[Vtպj5nM[Vtպj5nM[Vtպj5nM[Vtպj5t 婼JM*z..............................j_m'Zx4-G^ Ék%9Sهײ+e9vTX07i ԖM3E2yچ#Y_%ѣ49e2T&AH1!ށ ~|4PPBg娙yVUtxGĉD`>Jم/k_ ؑcDw)"D6$İ.?Ӷ$O4apt^ܙEAmcv@ ]/#4iq[6|q\V;|4PPBg;̝묻 Oi?1?8>9yjc q(|!3sNxQk|J.]4bDX)ō9"}1%+"ĔCSe3؝E?fGH&"alx cAGB vDhkGJ_*͛\'Oua 1C9ZgLӼ'sh`n_1?88Bg;+!6 jȭɁS:Vddn*\N|@ i7W);dQt]cPahx>39ZgLӼײS&鹧IgWZ+IoIE.##5L};!5!bC S% A.|PӦKCv&ii6Em:UnxPqt6lŹ B`X$sO<$9yAR[LvtT>cjI!3sG9;ę84|_>cjI!3sG9;ę84|_>cjI!3sG9;3&qh~1?ܵ|ɜ!3sGyiL c(ww?ܵ|ɜ!09+++++++++++++++++++++++++++++++?&pVE%O69SNjeS ^vc'ǣeV5ƈhp&17vZAF,Dt-*hLL1^=2-'cgUd5 cdj1Z?|8eUMFvO64i;kWHPٸ#crܣF $5+|V b 2TșiL{}^+aNL2cbyZDr#fYo16yD0lLG93 5phΓ'S풟UUKJa3 v9VF̄!'3rMՆEnZ~[3 ӑ)|2aĚ&yj8G$!W̙9&i.^m@́>&9k6 j綡l*Il[Z39Im+tg>(@Y qqp"Rzky&XiLeP][*2l휮2tXMiQTʓ9JSg/%66vN&sh a&~Iǚ[aWQʓ9^C,ɦ 2Q`PXe:LmcCds++t&ldGSU^B ɷ?;&pIA49oYN)N(q!f#ZZMNjldJe$im#ؕsW iegm21iM.+3 x)-.=2.orFŐlBkHc]P;gAdЌ^s?u ŬMxA_S52mQ*? %+I}Oh7MІ:eWhv΍J`$FM"?&l[XXRF|8nJٴRgj҈0McAil't%hYo}EgfeZ#fr] ܞDjPQ`חbN^TS%}@ln6жmآ?YFES5FtN ?l"!ȝwxDpağw &pHy$Q|Gx׏3r|ɜ#2^^^^^H+گjگjڤu^{UW^{UW^nدjگjڧf3r;Hykései,6KhÍҳnek}UbJ`q8|v㲡Կie%41 j[SIg;_1[ h9@ `ythaH+MΔfZQ:2ou3r2 0dR:?u HrZd=-ld$0@|8p.J5讆 JqK eBm6/ҝq?GrlZ'JBEJebLxUΊPeGs蘜or_g\b'f)c99kiQֺQM2ٯ2͓I>I?|$I$z3I& ,f+1Iz)$QRzzzzzzzzzz!r!r!rzzzzzzzzzzzzzzQ+CMZg|ҧ,ACp,B,B,B,B,B(8i^  X%-MhXXr$͕MJ:!KQtCDj"҄hdB[hG&!b!b!b!b!b!b!b!b!b!b!b!b!b!b!b Ey7 ќx P 5V.0uB@"ҬzFBr,05t7Ml`5>U ~he4冴` lZRcR莢Z``X - .1E`T,!љaĚfs%L^I,4α l\ SU8QՀTV0MՊBi>d L [*8$j9JA~Y3.)ގSLL zLsxNEguaUgkgFUrr:T ^`sz3Ury2KHjeF XFFJWA.%4eMQ!PD$ q)DT7 |Ll -q@D1cc7D{W}W:TPߜP_0ʥ*ئ |ǥP]bƍE =IKb3ש^< zh)2ЩRJ*TRJ*TRJ*TRJ*R6[Es,g%-eZYk-eZYk-eZYk-eZYk-eZYk-eZYk-eZYk-e"3taH4Bi}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}^h,\drzL7A"1׫py^Y@ө, DS4 KJf+iʆE U`'PF*`d pKz)A3|̋$4}urc(ji5|q)QB,f(j:A~74L$Rto5)B,֣I"dU\-4(U E0*CrzLA1 &)2!grzLA58X?9=BrZ`PXֿᄒPgqzL9= ,J$Ki,ٴ;WGTP&lLSE[ ;`ذ]!Z֬CӘCq:L9= "W?azcOڪT+̪6*<9cb.)V#*dU*S4iN d/p,g->pXxW)9&NHd4jҘS#P>6>xX{>F`|o8m|а+|B_s awA3\] qP>7v!a7A6!a'A霖aaGAtri_AX Z, /8{~44[qn-Ÿ[qn-Ÿ[qn-Ÿ[qn-Ÿ[qn-Ÿ[qn-Ÿ[qn-Ÿ[qn-Ÿ "0sdg5#MJdTEI#w8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw8sw9sw9sw9sw9sw9sw9sw9sw9swi&3xr)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)0H<0|LzuPFRNJ=JX>!i"u jb*iC £P8'7 ODBn8SpˆxUNW8hhD<`}pz$%jj=Γܿb\ y/sB!B!B!@u众]x:Os!=I 3>~d^YgQA{w|/ȹ"_K}.ԺR]Ku.ԺR]Ku.ԺR]Ku.\v/Π3jz^|8BL5$:"ChRӄȦϧa8xA+KD'2V0≯_w:VhZ?12Mx~b1"_ 3>~+зUe9r!&OKS +bGhc:[94FX: ē VRs8 8' eYytPjub:Y@ւ$lXJyc) t*adƵe3ài$YY/ ?\pCittٝh6jD&zG\krlbydDI")S5)LFnfV$BϣXDPz&C}LYgE_ES544t2Ц%g: j$@9le!`]@c;F8%+ey=ia?9e'?XOh 5@8bRބTJ&T=gm2FѲz*'nW=)*uxh!=dؒI:TweYMTh<|ulTr;ކTPqܪ-dmZ %* Q/bHPSE.5i_]4QO܁In4/byuog$Jtf0e4 sIE'ACu{fs!W*IRzPq|0L'BjߐӜd$QD=SiϺ̷ۣ41Cp]Q=z5BUb/$I$I$I$I$sLb$iL2I$Eᚲ^O3y bؿ/bؿ/a%tjX.ob.ob.ob.ob.oaàz7s{7s{7s{7s{Դ^ <%7s{7s{7s{7s{,a}?pz?6&bXId[xI8gjgmd%4?4?\Wpd , c5gO'L%|[JAptxLRpeKH07Dx'LE~|/>L'㡌TBS)x=Z3:ʥ1F9,,W 3v?j0_Ճ+%&'QX*#ӃiY%Fyx֡&MNqkIP3# ɯrn∔CLR㴧GM]s yIS:<,f36tX㘡JbS qhxsgIPH@DjvZ]SǛP>8=YɂQO/8pÇh3#t#hN~====Ts;9@(====tHH͑lVLRh====Ji5^O1"Eٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl]fٱvl] nF 7勒I$I$2oF!g I$v?K2՚5P݆mmmm$A  A  $ $`I$H$ ߐ $ I@m"XA"memm!-$I$hmmmmmmmmmmm@n@A $ }mmmmmm-{mmmmmmm|ğ$ $I$I$I$I$I$G'I$I$I$I$I$I$N$I$I$I$I$I$I$I?$I$I$I$I$I$I$I$~xƖ)I$I$I$I$I$I$  $I$I$I$I$I$I$I$I$I$I$I$I$I$RDI$I$I$I$I$I#-2$I$I$I$I$I$FىH$I$I$I$I$I$I$yI$I$I$I$I$I$I$I:&$I$I$I$I$I$I$I$}LI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IӋQ$I$I$I$I$I$I$I$6I$I$I$I$I$I$I$I#dDI$I$I$I$I$I$I$G $I$I$I$I$I$I$I$AmmmmmmmjʒI$I$I$I$I$I$I$I+!mmmmmmmm#mmmmmmm?n] $I$I$I$I $H9my&i&sMMmmmmmm'~o>mOI$I$I%A 9 0P2B(A$HDI$I$I.qI 6MM,ԤI$I$I$I$I$I$I$YͶmmmmmmmm$I$I$HI[mԍlFmI$I$I' )nkfi6n$I$I$].[me-KeI$I$I$$Immжٶ[l{8I$I$ImlmKmemi$I$I$I$I$I$I$I$I$*!1QA 0P`aq@?j3aw:0e0 nrXg<.OVfcħY q5ɴþ;W.eF߬y5IڥM,T]W`֯c&aMq´;D}D⨚&\4!2.ae 4X$X?uU Q9?+?JeX՘ ]W*YVɢnx.Ѽ0?YӵI jnF b8 ˺\F̎E]K &Er)0w'zzMXN1r`[6bkLoR,ug|Ы_cɂ3I&a I5qiQ F[wxŸ~d_c)JR)JcyvE)j(ٺjL֨y?= 34CWG_s!WK>34Cgzƈ =cD?YY 1_}34CLZ>4C #D<>4C #D?380xoC/380xoC/38އ> O p.)JR)JR)JR)JR)JR)JR)JR)JR8  Ҕ)JRO8 u!BR}<7hB!Bt>B!B!B!NB!z!B!B!B!B!B!B!OއJR)JR)JR)JR)JR)JR)JR)JR}<7h<+1͢zҔ)JR)JR)Gzd!B!B!B!B!B!B!B!B]<7h D17iJ^)zҔ)J_%އB!B!B!N!B! Gz}""zO p/:AA(`K@/O p/K//\TfΟat5Fa q3 E}_nƨ5_9}0^}8_>j_(r q3 Eh:}0^}0^}8.ƨ5 8ƾ}8Ƣۮq3Eg8].ƨ5WLTgǦq3zB!B!B!B!B!B!B!B!Nƨ5Qj/!B!B!B!B!B!Ba3Ee#;-5AvtOq֝^ `lچ{tpIJmh@`P=u!ue) B "ɪ a[\2OB]tV(*w/DIPlDH AXҔ b7#Zi$x,4(ڲچA]B&dBlLA @c{4wmt[ c]B0׼doŷT tk^p>9MWf6Piu[u SW܉Va)ֺ=h΍[V EV*M/k$F"lR4 {d-j(;Aw, 5]Um!$yJd`Q]^-:ݼ }Kxכ6۵bի.ݹpBCƏ>l͛nݻfɳgIoH>g9r6Y÷_M25o@9M\aү oUc- !3WS_J0^(J÷U6"ƀ"+"2EQ"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"3m{R#Xv۷nݻv۷nݻv۷nݻv۷nݻv۷nݻv۷n\r˗.\r˗.:Y\XueXE\>9sRK5.j\ԹsRK5.j\ԹsRK5.j\ԹsRK5.j\ԹsRK5.j\ԹsRK5.j\ԹsRK5.j\ԹsRK5.jUluK :0%i}Z-~2)4ܩ`WҪPAoAZD7sTh.APY:AM**C J j[VU@!Kv, DZѶf5!i3NiB-"R@KJ䵵  qԭ]Ere)b6D̹r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\l44Vr*61qc#a6J{[kRaV&P7.鈇.\k~PH0U 6Q>h"U ,̇(t+h*u25`t2KH0=qil*,*L\I.ImC[S@mt&1e37ԯNLu .\r˗.\r˗.\r˗.\r˗.\r˗.\rˊhz/S+9NbpiçqvqYp 'p 'p 'p 'p 'p 'p 'Zq6p9 qç2Nrr}}u%4V q='%9BNq9ӛW9 3[9l峖[9l峖[9l峖[9l峖[9l峖[9l峖[93_9SNyAs'9=ni]⍣e8S XX)4V惨|΂.iO46.nUg3|ϙ>g3|ϙ>f#P>g Je./y7UuUUϙ>g3UZAjGUWݟ3|ϙ ( [nug3|ϙ>g3|ϙ>g3|ϙCX .$A.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\rhv^ Tؘ፠'rueV+ ]#3ХVmYnh; j,ț>ef:n !I))9"ѭD -P^a Wf!k`ycKM"[$Lm8ؗ*ΐ^lԏ%8[%$d]AAmSb*=EfMV։aR*h?Ũ2l^Nx@aa9Rn/I?h͚Ubҧb [(YыU>. 1*AMJիVZjŘAM_PX5Dl>*իVZtҧ K# % k*իVZ`H D I`K_V%%%%%%%%tttttttttQQQQQQQQ(((((((( D͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛5SE%@?tmp9balx013/distribution/innosetup/rdprogress.jpg0000644000175000017500000001160613616566001022371 0ustar carstencarstenJFIFxxC   (1#%(:3=<9387@H\N@DWE78PmQW_bghg>Mqypdx\egcC//cB8Bcccccccccccccccccccccccccccccccccccccccccccccccccc" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?MźY&KǓ_z ֭}J[ߺ_Juߺ§ ^Ɵa:nQK =mb Z~Ɵb]Y6&[~R^Ɵb}N$݃G}?cSƟb}NM]y16R~;~TͷyMRj+MzpM9QM~*:̦ã(;t#g6:0ZG iU3f@ w鎝+Դ=:Q|soaqUoFȏ5E5˯K:G=?LGx &0XIK֖ p/cTT6 _Ü?/PkkHOKޓ>Ɵ)vajķwW6jg2qyekh[sBL:q~P+sIOK>ƅLN28AN+}#ij̟f"+K_G>Ɨً3tȍ4aiin4SoN}Ɨً(N}Ə]?}>̟a# ti?opy8WSa%|:Aڟr)if2c+w/{TmQY ?"O]=}FnwCZyGgq|>jעe^G=!ls89+^9|WW2Ko, dsFIWD.mNB>(̀ [[Fʽ p׆>Z٭0v1F1\q=zԾ|??Q=c9 Ry$9NУχz} χz} <Р (Уχz} χz} <Р (Уχz} χz} <Р (Уχz} χz} <Р (ХYcsuch4)?8O?C5qWnDѭbKWr?$?>VQB$ZߡU5_-7-10Fc@o꾥 ]W5cQEQEQEGr#00L=1=18 (LoROF:ut%dر"8Gf}=(F1#,} [ܛQEQEQEQEVYգ_2?FO:(j㢀 _\UBM ȱŸfms?Z&丳v=Y' Vt/c'PWԿ&mп絏*_O@Vt/c'Pu {XIn=$TM$2Tx$ȭc1$0$mђF !fX~gp&F,E="UTaNFy דϽo}ch5}??Gy~t8\qO߳ZϬfX¢~i>O4}}ch 5}?kO *+w֟G٭??ƀ0߳ZϬfX­mrٖ}}ci ; njP4)?8O?C5O_$iXXjFlQ܎yc?'~8eq3{ Pmc38w> qs1u^ "ۈ-Gs L #_Zo bE|lb9zaqs1u^9xl3h#)!3 'laNF]ni-k brr1}#GR(b_hBQ#ˍ>ն*7|8^WӉxK07_#GR(b_k-m,.:As0Yqc@\Îy(1u/?F!PrlUm:=:;HY8'֬EPEPEPEPEPEPEPzQהtQyIE\_I3\U? ?/G"O⨢E?Q(tmp9balx013/distribution/innosetup/ponyprog.html0000644000175000017500000023321413616566001022241 0ustar carstencarsten PonyProg Documentation

PonyProg v.3 documentation
by
LancOS - Lanconelli Open Systems

http://www.LancOS.com

Last update $Date$


Contents

1 Installing
2 Menu Commands
2.1 File
2.1.1 New Window
2.1.2 Open Device File
2.1.3 Open Program (FLASH) File
2.1.4 Open Data (EEPROM) File
2.1.5 Save Device File
2.1.6 Save Device File As
2.1.7 Save Program (FLASH) File
2.1.8 Save Data (EEPROM) File
2.1.9 Reload Files
2.1.10 Print
2.1.11 Close
2.1.12 Exit
2.2 Edit
2.2.1 Edit note
2.2.2 Edit security bits
2.2.3 Edit buffer enabled
2.3 Device
2.4 Command
2.4.1 Read All
2.4.2 Read Program (FLASH)
2.4.3 Read Data (EEPROM)
2.4.4 Read Security and Configuration Bits
2.4.5 Write All
2.4.6 Write Program (FLASH)
2.4.7 Write Data (EEPROM)
2.4.8 Write Security and Configuration Bits
2.4.9 Verify All
2.4.10 Verify Program (FLASH)
2.4.11 Verify Data (EEPROM)
2.4.12 Erase
2.4.13 GetInfo
2.4.14 Reset
2.4.15 Program
2.4.16 Program Options
2.5 Utility
2.5.1 Clear buffer
2.5.2 Fill buffer
2.5.3 Double bank
2.5.4  Byte swap
2.5.5 Set Serial Number
2.5.6  Serial Number Config
2.6 Setup
2.6.1 Interface Setup
2.6.2 Calibration
3 Hardware interfaces
3.1 SI Prog
3.1.1 The main board
3.1.2 ICBus eeprom adapter
3.1.3 Microwire eeprom adapter
3.1.4 SPI eeprom adapter
3.1.5 SDE2506 eeprom adapter
3.1.6 NVM eeprom adapter
3.1.7 AVR micro adapter
3.1.8 PIC micro adapter
3.1.9 Jumper setting summary
3.1.10 Serial cable
3.1.11 Electric schematic
3.1.12 Mounting plan
4 Scripts
4.1 Quick start
4.2 Command reference
 
FAQ
Appendix
A

1 Installing

Installing PonyProg depend on the system you have.
With Windows95/98/ME or NT/2000/XP just run the Setup.exe and follow the instructions.

With RedHat Linux 6.2/7.0 login as root and execute the command
# tar xvfzP ponyprog-X.XXX.tar.gz
# chmod +s /usr/local/bin/ponyprog
(optional)

If you want to use parallel port interfaces without run PonyProg as root you need also a 2.4.x kernel and parport, parport_pc and ppdev kernel modules. insmod all three modules before to execute PonyProg.
If you want to use serial port interfaces be sure you have the rights to read/write the /dev/ttySx devices and /var/lock directory. With RedHat you may want to add your user to uucp group.

The first time you run the program remember to select the interface and port you use with the Setup. If the program report a message like "The interface don't respond" when started, it means that you not have configured the port properly, or the interface is not connected.
You need also to run Calibration in most cases.


2 Menu commands

The following is an explanation of each menu command.


2.1 File

2.1.1 New Window

Open a new window, each window display a buffer for the device selected.


2.1.2 Open Device File

Open a file by name, and read its content in the current window. You can select the file to open through a dialog or drag and drop the file to open over the PonyProg window. PonyProg recognize several different types of file format: e2p, intel hex, motorola S-record and raw binary. If the selected file doesn't seem to be a e2p, it tries to open the file as intel hex; if this operation fails, then it tries to open the file as S-Rec; if also this operation fails, then it opens the file as binary. If the file has e2p format, you don't need to worry about the device type currently selected, otherwise you first have to select the correct device type, then load the file. In case of splitted Program/Data device like AVR and PIC the content of the data eeprom will be displayed after the content of the program flash memory in the current window with a different color.


2.1.3 Open Program (FLASH) File

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command Open a file by name and load only the program memory. You can select the file to open through a dialog. The file to load may have one of these format: intel-hex, motorola S-record or raw binary.


2.1.4 Open Data (EEPROM) File

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command Open a file by name and load only the data memory. You can select the file to open through a dialog. The file to load may have one of these format: intel-hex, motorola S-record or raw binary.


2.1.5 Save Device File

Save the content of current window buffer to a file. If no name has been specified it works like Save as.


2.1.6 Save Device File As

Open a dialog box where you can specify the name of the file. In the bottom of the dialog box you can select the file format for the file to save (indicated by the extension). If you press OK the content of the current window will be saved in the file specified. I suggest to save always in e2p format, doing so the device type and the notes will be recorded in the file. The .bin format is raw binary format, it's commonly used to export the file to other programs.

SaveAs screen shot


2.1.7 Save Program (FLASH) File

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command save the content of current window buffer program memory to a file. A dialog box asks you the name of the file to save and the file format by selecting the extension.


2.1.8 Save Data (EEPROM) File

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command save the content of current window buffer data memory to a file. A dialog box asks you the name of the file to save and the file format by selecting the extension.


2.1.9 Reload Files

This command reload last opened files in the current window buffer. It's useful when you need to edit/build the files from an external program (assembler/compiler) and you need to repeat the same cycle: compile - load file - write device more than one time.


2.1.10 Print

Open a dialog box where you can select the printer name and options. If you press OK the content of the current window will be printed.


2.1.11 Close

Close the current window, if there is only one opened window a dialog window asks you if you want to exit; you can choose Yes or No. If the current window buffer is modified a dialog window asks you if you want to save the content in a file before to close the window.


2.1.12 Exit

Close all the opened window and exit the program. If there is a modified window buffer a dialog window asks you if you want to save the content to a file before to close the window.


2.2 Edit

2.2.1 Edit note

Open a dialog box where you can edit a Chip id and a note. These two fields are saved within the window buffer if you use the e2p file format (see Open). These two fields are free text editing, and are useful for a description of the device programmed and the meaning of its content.

Edit note screen shot


2.2.2 Security Bits

Open a dialog box where you can edit a device specific Configuration and Security bits. This dialog is especially useful for microcontrollers, because they could not work at all without set these bits in a correct way. The following screen dumps show the configuration bits for some microcontroller families. Note that disabled bits (grayed) are not used or not modificable.

AVR AT90S4433 Security and Fuse bits

PIC 16F84

  • CP: if checked all memory is code protected
  • PWRTE: if checked power-up timer is enabled
  • WDTE: if checked watchdog timer is disabled
  • FOSC1,FOSC0: oscillator selection bits
    FOSC1 FOSC0 Status
    not checked not checked RC resistor/capacitor oscillator
    not checked checked HS high speed crystal/resonator oscillator
    checked not checked XT crystal/resonator oscillator
    checked checked LP low power oscillator

AT89S8252

Microchp 24C65

The dialog ask you to insert the first block and the number of blocks to lock. When the device is locked you can't do a "write security" or a "write high endurance" anymore. To lock the device the number of blocks must be greater than 0.


2.2.3 Edit buffer enabled

You can toggle this item either to enable or disable the edit mode. If the edit mode is enabled you can modify the buffer content by clicking on a location of the current window. Two editing modes are available: hexadecimal editing and text editing. If you click on the HEX (center) part of the screen or press ENTER you open a dialog where you can insert the new value for that byte in decimal, hexadecimal, or character. If you click on the ASCII (right magenta) part of the screen you open a dialog where you can insert or modify a text starting from that location. You can CUT & PASTE in the text entry dialog by the use of the right mouse button. Note that you can enable/disable only the edit mode of the current window, so if there are more than one buffer window opened, the edit mode of other windows are left unchanged.


2.3 Device

Select the type of current device. You have to select the device type before any commands (read, writing, open, save, ...). Selecting an "Auto XXX"  type means that the device type is determined by the program during the read or write operation, this feature is useful when you need to query a device to know if it works and which device it is. There are some different device family: the IC Bus eeproms that are addressed with 8 bit word, the IC Bus eeproms that are addressed with 16 bit word, the Microwire eeproms with 8 bit organization, the Microwire eeproms with 16 bit organization, the SPI eeproms, the AVR microcontrollers, the PIC 16 microcontrollers, the IMBus eeproms and SDE2506 eeprom. You can select the device family in the tool bar with the combo-box, or directly the device type in the menu. The current device type is stored in the .INI file, so the next time you run the program it's recalled. To read and write IC Bus eeproms other than 24xx (i.e. the SDE2526, SDA2546, SDA2586, SDA3546, SDA3586) select the type "24XX Auto".
The 24C01 can be readed but not writed, you can read it as a 2402 or 24XX Auto device. Note that you can often replace a 24C01 eeprom with a new 24C02 eeprom, because it's fully compatible to the 24C01.
Several microwire eeproms support two types of word organization: 16 bit organization and 8 bit organization. The organization is selected with a pin connected to VCC or GND. SI-Prog adapter connect this pin for 16 bit organization, however some devices support only 8 bit organization.


2.4 Command

2.4.1 Read All

Read the content of a device in the current window buffer.  This operation can take a while to execute, so a dialog box shows the operation progression. If you want to stop the current read just press the "Abort" button.
Finally a dialog box showing the result of the operation appears.
If the program report the message "Device not responding" means that you missed to connect the device to read, or the interface is not configured properly (see the Setup). Note that only the devices that support probing report this type of message, other device simply read all 0's of FF's (if the device is missed). The devices that support probing are the 24XX, the AVR and some PIC. In the case of AVR device selected, the program can report the message "Device locked" in case of the locked bits was programmed. Even some preproduction devices don't support auto probing. You can't read a locked device, to program it see Write.
Since version 1.15c if you select an AVR device (AT90S2313 for example) and read it, the program try to probe the device first. If the device is missing, or the device is locked, or the device is a preproduction device a dialog box appears. It asks you if you want to abort operation, retry or ignore the error. In case of a preproduction device just select "Ignore".


2.4.2 Read Program (FLASH)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command read only the program memory from the device, and leave the data memory intact.


2.4.3 Read Data (EEPROM)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command read only the data memory from the device, and leave the program memory intact.


2.4.4 Read Security and Configuration bits

Read security and configuration bits from the device. Note that this command is implemented only for some devices. To modify the security and configuration bits refer to edit command.


2.4.5 Write All

Write the content of the current window buffer to a device. A dialog box ask you to confirm this unrecoverable operation. This operation can take a while to execute, so a dialog box shows the operation progression. If you want to stop the current write just press the "Abort" button. After the write operation an automatic verify is executed. Finally a dialog box showing the result of the operation appears.
Before to perform a write I suggest to select the exact device type, not the "24XX Auto" or "AVR Auto".
Note that both the program (FLASH) and data (EEPROM) memory are writed (only if the device is a splitted device like the AVR or PIC), and then verified.
Since the version 1.15c a probe is performed on every AVR device (see Read).


2.4.6 Write Program (FLASH)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command write only the program memory to the device, and leave the data memory intact. The exception is the AVR device: to write the program memory an erase is needed, so the data memory is erased too. Some AVR devices have EESAVE fuse bit, when programmed the EEPROM is preserved during a flash erase.


2.4.7 Write Data (EEPROM)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command write only the data memory to the device, and leave the program memory intact.


2.4.8 Write Security and Configuration bits

Write security and configuration bits to the device. Note that this command is implemented only for some devices. To modify the security and configuration bits refer to edit command.


2.4.9 Verify All

Verify the content of a device, compares it to the content of  the current window buffer.  This operation can take a while to execute, so a dialog box shows the operation progression. If you want to stop the verify just press the "Abort" button. Finally a dialog box showing the result of the operation appears.


2.4.10 Verify Program (FLASH)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command verify only the program memory from the device, and ignore the data memory.


2.4.11 Verify Data (EEPROM)

This command is available only for splitted Program/Data devices. The buffer is splitted in two different part for these devices: the first part for program memory and the second part for data memory. This command verify only the data memory from the device, and ignore the program memory.


2.4.12 Erase

Erase all the content of a device to FF's (both program and data memory). Note that this command is implemented only for AVR and PIC devices.


2.4.13 GetInfo

Shows some informations about the device. Some of these informations are showed also in the status bar at the bottom of the main window.

  • Size of the buffer, it's equal to the size of the device in bytes. In the case of AVR or PIC devices, it's equal to the sum of the program memory size plus the data memory size.
  • CRC calculated on the content of the buffer.
  • Bank roll over. It's a characteristic of some old IC Bus eeprom (24XX). In some case uou can't replace a "roll-over eeprom" with a "no roll-over eeprom".
  • Security and High endurance block. The Microchip 24C65 has a feature to protect some block from writing, or enable some block to have 10 milions writing cycles. (see edit to change it).

2.4.14 Reset

Reset the device. It's useful with in-system applications.


2.4.15 Program

Execute a customizable sequence of commands. You can select the commands to execute with program options


2.4.16 Program Options

Select the commands to execute with the Program command.


2.5 Utility

2.5.1 Clear Buffer

Clear the current window buffer with FF's.


2.5.2 Fill Buffer

Fill the current window buffer with a character. A dialog box asks you to select the addresses fo fill (from - to locations), and the value of the character to fill. You can insert the value either in decimal (i.e. 45), hexadecimal (i.e. 0x45) or octal (i.e. 045) base.


2.5.3 Double bank

This command duplicates every bank in the current buffer and changes the device type to a bigger device type. A bank is a cluster of 256 bytes for the 24xx and a word for other devices. This utility is useful to replace a SDA2546 device with a 24C08 or a SDA2586 with a 24C16. Example: you have to select the device type "24xx Auto", connect the SDA2546 device and perform a Read operation. Then you have to perform a "Double bank", replace the SDA2546 with a blank 24C08 and perform a Write operation (Refer also to I2CBus adapter).


2.5.4 Byte swap

This command swap bytes within every word in the current window buffer. It's useful to convert from little endian representation to big endiand and viceversa. Some devices uses 16bit word so you can represent it in both ways depending on your needs.
For example consider the number 1234 hex (4660 decimal), the little endian is 34 - 12, while the big endiand is 12 - 34.


2.5.5 Set Serial Number

This command set the serial number in the configured locations of the current window buffer. You can configure the serial number location, value and size with the serial number config command. Every time you execute this command the value is incremented.


2.5.6 Serial Number Config

This command open a dialog box where you can configure the serial number locations, value, format and size.


2.6 Setup

2.6.1 Interface Setup

Open a dialog box where you can select the interface type and the port number where the hardware is connected. You can choose from several hardware interfaces (see PonyProg Hardware interfaces for more info). Note that only SI Prog support all devices.

Setup screen shot

  • SI-Prog interface select "serial" check-box and choose "SI-Prog API" or  "SI-Prog I/O" in the combo-box. Windows 95/98/ME and NT/2000/XP work either with "PonyProg API" and "PonyProg I/O", but the latter is faster. To use the "SI-Prog I/O" with Linux you need to run PonyProg as root. Then select the COM port you want to use, if some COM ports are disabled it means that they are used by other programs (usually by the mouse driver or modem), or not installed or access denied (may need root privileges). If you use added COM ports (PCI or PCMCIA cards) you must use "SI-Prog API". Note that USB2RS232 adapters often don't work or are very slow.
    To access COM ports from user mode in Linux you need the rights to write /dev/ttyS0,1,... devices and /var/lock directory and select SI-Prog API (this is the preferred way).
  • AVR ISP Parallel port interface select "parallel" check-box and choose "Avr ISP API" or "Avr ISP I/O" in the combo-box. WindowsNT/2000/XP work only with "Avr ISP I/O". To use the "Avr ISP I/O" with Linux you need to run PonyProg as root. Then select the LPT port you want to use. Note that if you want to program the AT89Sxx device you need to select the "Invert Reset" check-box. To use this interface with Linux you need a 2.4.x or newer kernel and parport, parport_pc and ppdev kernel modules and you need the rights to write /dev/parport0,1,... devices.
    You can use this interface to read/write the AVR micros and SPI eeproms.
  • Ludipipo/JDM interface select "JDM API" or "JDM I/O". Then select the COM port you use. All the considerations for "SI-Prog" interface above are valid for JDM too. You can use this interface to read/write the PIC16x84 and 24Cxx eeproms. If you want to use JDM interface to program 24Cxx devices you have to connect pin 7 of the 24Cxx to GND (schematics are wrong).
  • Easy ICBus interface select the "parallel" check-box, then select the LPT port you want to use. All the considerations for "Avr ISP" above are valid for "EasyI2CBus" too.
  • DT-006 interface This are the simplest interface for AVR programming (you can find the board on Dontronics site). However I strongly suggest to use the buffered and safer "Avr ISP" interface above, especially for ISP, since the buffer go in Hi-Z state after programming.

2.6.2 Calibration

Calibration tunes the serial bus speed for your computer. When you run Calibration be sure that PonyProg is the only program running in the PC, and the hard disk is idle (look at the HD led). If your PC is busy because it's performing other tasks the Calibration thinks your PC is slower than actual speed, and all I/Os are performed without proper delay.
After the Calibration you can choose the speed for every serial bus modifying the following parameters in the ponyprog.ini (.PonyProgrc under Linux) file:

  • I2CBusSpeed=NORMAL    affect 24Cxx eeprom and other ICBus devices
  • SPIBusSpeed=NORMAL    affect AVR micro, AT89Sxx micro and 25xxx eeprom
  • MicroWireBusSpeed=NORMAL    affect 93Cxx eeprom
  • PICBusSpeed=NORMAL    affect PIC16x84 micro
  • SDEBusSpeed=NORMAL    affect SDE2506 eeprom

Every parameter can be assigned the value ULTRASLOW, VERYSLOW, SLOW, NORMAL, FAST or TURBO.
Avoid to use the TURBO value because it means "no delay", and probably it doesn't work on your PC, especially with the I/O driver.
Just for example my PC (Pentium MMX 200MHz) run ICBus at about 80Khz with NORMAL, and 110 Khz with FAST. Note that a lot of ICBus devices don't work at speed above the 100KHz.

A special note for AVR devices. The AVR need a valid system clock to be programmed via SPI and the max frequency of the SPI bus depends on this system clock. So if you changed the fuse (even accidentally) to use low clocks like 1MHz or 32.768KHz you must change the SPIBusSpeed=VERYSLOW or ULTRASLOW to access the AVR anymore. If you have to use such low clocks I suggest to program the flash and eeprom first, and at last program the security and fuse bits.


3 Hardware interfaces

PonyProg supports several hardware interfaces, however note that only with SI-Prog interface you are able to program all the devices.
Next paragraphs show to you all the hardware interfaces in detail.


3.1 SI-Prog

3.1.1 The main board

Connect the DB9 connector to PC COM port using standard serial cable.
Connect J2 connector to the correct adapter observing polarity (look at pin 1 and pin 10).


3.1.2 ICBus (2-wire) eeprom adapter

This adapter is needed to program all ICBus devices: 24C02, 24C04, 24C08, 24C16, 24C32, 24C64, 24C128, 24C256, 24C512, PCF858x and SDA2526, SDA2546, SDA2586 eeproms. Connect the adapter to main board observing polarity. Insert the eeprom in the socket with the signature: 24xx (A0). If you need to access a 24xx eeprom with SMT case (SO8) place the device with every pin exactly on the corrisponding pad and press to make the contact good during the read/write operation.
Some devices mount two 24Cxx eeproms at different address and access them as a large single eeprom. You can achieve this with the two sockets A0 and A2. For example if you insert two 24C02 eeproms, select the "24XX Auto" device and perform a read. PonyProg detect a 24C04 eeprom and the content is the sum of the two 24C02 eeproms.

Some eeproms (especially old SDE and SDA eeproms) need external power for a correct programming.
To use external power you need to connect a 9V battery to J9 and move JP2 to "ext" position.


3.1.3 Microwire (3-wire) eeprom adapter

This adapter is needed to program the Microwire devices: 93C06, 93C46, 93C56, 93C66, 93C76, 93C86 eeproms. Connect the adapter to main board observing polarity. Insert the eeprom in the socket with the signature: 93Cx6 or 93Cx6X depending on the exact device model. Note that some devices support only 8 bit organization, look at the following table to know what socket to use and menu device to select.

Microchip Microwire (3-wire) Serial eeprom

Part Code

Org.

Socket

Power (*)

Menu Label

93AA46

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

93LC46A

8bit

93Cx6

Ext/Int

MicroWire 8 -> 9346

93LC46B

16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

93C46B

16bit

93Cx6

Ext

MicroWire 16 -> 9346

93AA46X

8/16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9346

93LC46AX

8bit

93Cx6X

Ext/Int

MicroWire 8 -> 9346

93LC46BX

16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9346

93C46BX

16bit

93Cx6X

Ext

MicroWire 16 -> 9346

93AA56

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9356

93LC56A

8bit

93Cx6

Ext/Int

MicroWire 8 -> 9356

93LC56B

16bit

93Cx6

Ext/Int

MicroWire 16 -> 9356

93C56A

8bit

93Cx6

Ext

MicroWire16 -> 9356

93C56B

16bit

93Cx6

Ext

MicroWire 16 -> 9356

93AA56X

8/16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9356

93LC56AX

8bit

93Cx6X

Ext/Int

MicroWire 8 -> 9356

93LC56BX

16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9356

93C56AX

8bit

93Cx6X

Ext

MicroWire16 -> 9356

93C56BX

16bit

93Cx6X

Ext

MicroWire 16 -> 9356

93AA66

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9366

93LC66A

8bit

93Cx6

Ext/Int

MicroWire 8 -> 9366

93LC66B

16bit

93Cx6

Ext/Int

MicroWire 16 -> 9366

93C66A

8bit

93Cx6

Ext

MicroWire16 -> 9366

93C66B

16bit

93Cx6

Ext

MicroWire 16 -> 9366

93AA66X

8/16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9366

93LC66AX

8bit

93Cx6X

Ext/Int

MicroWire 8 -> 9366

93LC66BX

16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9366

93C66AX

8bit

93Cx6X

Ext

MicroWire16 -> 9366

93C66BX

16bit

93Cx6X

Ext

MicroWire 16 -> 9366

93AA76

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9376

93LC76

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9376

93C76

8/16bit

93Cx6

Ext

MicroWire 16 -> 9376

93AA86

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9386

93LC86

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9386

93C86

8/16bit

93Cx6

Ext

MicroWire 16 -> 9386

(*) If you experiment problems during the “write” operation, use the “Ext” power. “Int” power may not work on some PC, it depends on how much current is capable your PC COM port. If you don't use the LM2936Z-5 use the “Ext” power with ALL devices.

Atmel Microwire (3-wire) Serial eeprom

Part Code

Org.

Socket

Power (*)

Menu Label

AT93C46

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

AT93C46W

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

AT93C46R

8/16bit

93Cx6X

Ext/Int

MicroWire 16 -> 9346

AT93C46A

16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

AT93C46C

16bit

93Cx6

Ext/Int

MicroWire 16 -> 9346

AT93C56

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9356

AT93C56W

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9356

AT93C66

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9366

AT93C66W

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9366

AT93C86

8/16bit

93Cx6

Ext/Int

MicroWire 16 -> 9386

(*) If you experiment problems during the “write” operation, use the “Ext” power. “Int” power may not work on some PC, it depends on how much current is capable your PC COM port. If you don't use the LM2936Z-5 use the “Ext” power with ALL devices.

To use external power you need to connect a 9V battery to J9 and move JP2 to "ext" position.


3.1.8 PIC micro adapter

This adapter is needed to program the Microchip PIC microcontrollers: PIC16F84, PIC16F84A, PIC16F87x, PIC12C50x. Connect the adapter to main board observing polarity. Insert the PIC in the correct socket (look at the text in silkscreen on the PCB). Pay attention to polarity (pin 1).
To program PIC16F84, PIC16F84A and PIC16F87x you need a 9V battery connected to BT1, the JP2 on "Int" position, and the JP1 on "Bat" position. If your COM port can't provide enaugh current you have to provide an external power: connect a stabilized +15 Volt D.C. to J9 (pay attention to the polarity), move JP2 on "Ext" position and JP1 on "Ext" position.
To program PIC12C50x you need a stabilized +13 Volt D.C. to J9 and move JP2 on "Ext" position and JP1 on "Ext" position.

 


3.1.9 Jumper setting summary

Version 2.2 of PDF schematic

Jumper name (silkscreened on the PCB) Jumper function
JP1 Switch between battery powered and external powered PIC Vpp modes.
JP2 Switch between internal COM powered and external powered Vdd modes.
JP3 Select the polarity of Reset line for AVR AT90Sxx and AT89Sxx microcontroller
JP4 Connect pin 7 to GND. 24Cxx devices usually need this pin connected to GND, while PCF8582 no.
   
J9

Connector for Vdd external power. You need to provide an external power (9V, i.e.battery) when the Vdd drops under 5 Volts during programming. This may happen in three cases:

  1. your COM port don't provide enaugh current
  2. the device sink too much current (i.e. N-Mos devices)
  3. you replace the LM2936Z-5 with a 78L05
BT1 Connector for Vpp battery generated power. PIC16Fxxx devices need a battery to generate the Vpp = Vdd + 9V

 


3.1.10 Serial cable

To use PonyProg you need a serial cable DB9 Female to DB9 Male with ALL pins connected in the following way:

DB9 Female DB9 Male
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9

It's sometime called "modem cable", however check that all pins are connected. Avoid to use "null modem cable"s.


3.1.11 Electric schematic

Version 2.2 of PDF schematic


3.1.12 Mounting plan

Version 2.2 of PDF mounting plan


4 Scripts

PonyProg SCRIPT is a tool to automate programming. A script is a text file with extension .e2s containing a sequence of commands to execute. Every line contain a command, lines starting with the character # are skipped (comments) as well as blank lines.

4.1 Quick start

With your favourite text editor create a text file like this:

#------ START --------
#Programming sequence
SELECTDEVICE ATTINY12
CLEARBUFFER
LOAD-PROG flash.hex
LOAD-DATA eeprom.hex
PAUSE "Connect and powerup the circuit, are you ready?"
READ-CALIBRATION 0x3ff
ERASE-ALL
WRITE&VERIFY-ALL

#Pay attention to NOT disable RSTDISBL
#Fuse: "BODLEVEL ","BODEN ","SPIEN ","RSTDISBL    ","CKSEL3 ","CKSEL2 ","CKSEL1","CKSEL0    "
# 1 1 1 0 1 1 0 1
WRITE-FUSE 0xED

#Lock: {X,X,X,X,X,"Lock2 ","Lock1 ",X}
# 0 0 0 0 0 1 1 0
WRITE-LOCK 0x06
#------- END ---------

Save the file with extension .e2s (for example script.e2s) and then run:
> ponyprog2000.exe script.e2s

PonyProg will startup, select the ATtiny12 device, clear the buffer, load flash and eeprom files, read the osc.calibration to location 0x3ff in the buffer and then program the device with flash, eeprom, fuses and lock bits. When finished PonyProg exit.

If you use the avr-gcc compiler you will find useful to call PonyProg directly from the make file.
Insert the following lines in your makefile and then launch "make isp"

	ISPEXE = c:/programmi/ponyprog2000/ponyprog2000.exe
	MCU = atmega128
	TRG = myapp
isp: $(TRG).hex $(TRG).eep
	echo -e "SELECTDEVICE $(MCU)\nLOAD-PROG $(TRG).hex\nLOAD-DATA $(TRG).eep\nWRITE&VERIFY-ALL" >isp.e2s
	$(ISPEXE) isp.e2s

4.2 Command reference

#
BYTESWAP
CALL <command>
CLEARBUFFER
DELAY <msec>
EDIT-SECURITY
ERASE-ALL
FILLBUFFER [val][from][to]
LOAD-ALL [file][relocation_offset]
LOAD-PROG [file][relocation_offset]
LOAD-DATA [file][relocation_offset]
PAUSE [message]
READ-ALL
READ-CALIBRATION <address>[mem][osc_index]
READ-DATA
READ-PROG
READ-FUSE
READ-LOCK
RESET
SAVE-ALL [file | '--'][file_type]
SAVE-DATA [file | '--'][file_type]
SAVE-PROG [file | '--'][file_type]
SELECTDEVICE <device>
SERIALNUMBER [value][start][size][mem][format][autoinc]
VERIFY-ALL
VERIFY-DATA
VERIFY-PROG
WRITE-ALL
WRITE-DATA
WRITE-PROG
WRITE-FUSE [bits]
WRITE-LOCK [bits]
WRITE&VERIFY-ALL
WRITE&VERIFY-DATA
WRITE&VERIFY-PROG


[ ] optional argument
< > required argument


#

Description:
Any line starting with # character is considered as a comment and skipped.


SELECTDEVICE <device>

Description:
Select the device model to read/write.

Example:
SELECTDEVICE ATMEGA128


LOAD-ALL [file][relocation_offset]
LOAD-DATA [file][relocation_offset]
LOAD-PROG [file][relocation_offset]

Description:
LOAD-ALL load the whole content of the selected device from the file specified, this command is useful to load PIC and EEPROM devices with HEX or BIN format, or is useful to load every devices with E2P files.
LOAD-PROG load only the program FLASH portion of the device (useful with the AVR)
LOAD-DATA load only the data EEPROM portion of the device (useful with the AVR)
If no file is specified then open a file dialog to choose the file to load. The relocation_offset is an optional argument useful if you want to load at memory addresses different from that specified in the file. In case of binary file you specify the address from which start to load the buffer.

Example:
LOAD-PROG prog_memory.hex
LOAD-ALL memory.bin 0x100 (skip the first 256 bytes of the buffer)


SAVE-ALL [file | '--'][file_type]
SAVE-DATA [file | '--'][file_type]
SAVE-PROG [file | '--'][file_type]

Description:
SAVE-ALL save the whole content of the selected device to the file specified.
SAVE-PROG save only the program FLASH portion of the device (useful with the AVR)
SAVE-DATA save only the data EEPROM portion of the device (useful with the AVR)
If no file is specified it saves to the current file name, in case of no current file name it opens the file dialog to choose a file name. If the -- string is specified it opens the file dialog to choose a new file name. If you specify the file_type it saves the buffer in the selected file format, useful to convert a file from one type to another.
file_type can be:
- e2p to select the default E2P file used by PonyProg
- bin to select a raw binary format
- csm to select a custom CSM file format used by some TV repairer
- intel-hex to select standard INTEX-HEX text format
- mot-srec to select standard MOTOROLA SREC text format

Example:
SAVE-DATA data_memory.hex intel-hex
SAVE-ALL -- (save all the device and ask the file name)


READ-ALL
READ-DATA
READ-PROG

Description:
READ-ALL read the whole content of the selected device to the current buffer
READ-PROG read only the program FLASH portion of the device (useful with the AVR or PIC)
READ-DATA read only the data EEPROM portion of the device (useful with the AVR or PIC)

Example:
READ-ALL


WRITE&VERIFY-ALL
WRITE&VERIFY-DATA
WRITE&VERIFY-PROG

Description:
WRITE&VERIFY-ALL write and then verify the whole content of the selected device reading from the buffer
WRITE&VERIFY-PROG write and then verify only the program FLASH portion of the device (useful with the AVR or PIC)
WRITE&VERIFY-DATA write and then verify only the data EEPROM portion of the device (useful with the AVR or PIC)
WRITE&VERIFY commands require PonyProg version 2.05 or more recent. Usually you will use the WRITE&VERIFY, not the WRITE and then the VERIFY command because the former verify only programmed locations instead the latter verify all the buffer (slower).

Example:
WRITE&VERIFY-PROG


WRITE-ALL
WRITE-DATA
WRITE-PROG

Description:
WRITE-ALL write the whole content of the selected device reading from the buffer
WRITE-PROG write only the program FLASH portion of the device (useful with the AVR or PIC)
WRITE-DATA write only the data EEPROM portion of the device (useful with the AVR or PIC)

Example:
WRITE-ALL


VERIFY-ALL
VERIFY-DATA
VERIFY-PROG

Description:
VERIFY-ALL read and compare the whole content of the selected device against the buffer
VERIFY-PROG verify only the program FLASH portion of the device (useful with the AVR or PIC)
VERIFY-DATA verify only the data EEPROM portion of the device (useful with the AVR or PIC)

Example:
VERIFY-ALL


ERASE-ALL

Description:
ERASE-ALL erase the whole content of the selected device. Usually this operation bring all the locations of the selected device to FF.

Example:
ERASE-ALL


EDIT-SECURITY

Description:
Open the fuse and lock bits dialog to edit them.


READ-FUSE
READ-LOCK

Description:
READ-FUSE read the fuse bits (device dependant) and open the fuse and lock bits dialog
READ-LOCK read the lock bits (device dependant) and open the fuse and lock bits dialog

Example:
READ-FUSE


WRITE-FUSE [bits]
WRITE-LOCK [bits]

Description:
WRITE-FUSE write the fuse bits (device dependant).
WRITE-LOCK write the lock bits (device dependant).
If the argument is specified it is the numeric value of the bits rapresentation, note that a 1 means programmed. If no argument is specified the current value is programmed. Pay Attention to program the FUSE bits with the AVR, you can specify a wrong bit combination that will prevent you to access the AVR device in the future. Refer to the datasheets for the meaning of every bit.

Some AVR devices have more than one byte for the fuse bits. In such cases the argument is a multibyte numer and least significant byte is the standard fuse byte. For example:

argument = 0x010203
Standard fuse = 0x03
High fuse = 0x02
Extended fuse = 0x01

Example:
SELECTDEVICE AT90S1200
#Lock: {X,X,X,X,X,"Lock2 ","Lock1 ",X}
# 0 0 0 0 0 1 1 0
WRITE-LOCK 0x06

SELECTDEVICE ATTINY2313
#Fuse: "SPMEN " -
# "DWEN ","EESAVE ","SPIEN ","WDTON ","BODLEVEL2 ","BODLEVEL1 ","BODLEVEL0 ","RSTDISBL " -
# "CKDIV8 ","CKOUT ","SUT1 ","SUT0 ","CKSEL3 ","CKSEL2 ","CKSEL1 ","CKSEL0 "
# 0 - 0 0 0 0 0 1 0 0 - 0 0 0 0 0 0 1 0
WRITE-FUSE 0x00402


SERIALNUMBER [value][start][size][mem][format][autoinc]

Description:
Used to set a serial number in a location in the buffer before to write the device. This number can be specified every time or autoincremented from the previous one.

Example:
SERIALNUMBER 136 0x100 2 DATA LITTLEENDIAN NO
Set the serial number of '2' bytes and value '136' at address '0x100' starting from 'DATA' memory. The format should be LITTLEENDIAN without autoincrement


READ-CALIBRATION <address>[mem][osc_index]

Description:
Read the internal oscillator calibration value from the AVR and write it to a location in the buffer at the specified address (and memory type DATA or PROG). The osc_index argument specify which calibration value should be read since some AVR have several oscillator frequencies. The osc_index argument is available only from the 2.06c version

Example:
SELECTDEVICE ATMEGA128
READ-CALIBRATION 0x100 DATA 3
Read the oscillator calibration value for 8MHz frequency


BYTESWAP

Description:
Swap the order of bytes within a word in the buffer (low byte <--> high byte)


RESET

Description:
Reset the device


CLEARBUFFER

Description:
Clear the buffer (all bytes to FF)


FILLBUFFER [val][from][to]

Description:
Fill the buffer from location 'from' to location 'to' with the 'val' value.
If no argument is specified a dialog ask for these values.

Example:
FILLBUFFER 24 0x100 0x200


PAUSE [message]

Description:
Pause the program and show a message dialog asking confirmation to continue.


CALL <command>

Description:
Call an external program and wait for it terminates.

Example:
CALL notepad.exe


DELAY <msec>

Description:
Wait for the specified amount fo milliseconds.

Example:
DELAY 1000
Suspend the script and wait for 1 second


5 F.A.Q.

=============
AVR questions
=============

Q: I can't program ATmega, I always got "Write failed message".
Q: I can't program AVR AT90Sxxx, I receive error -21 and the program fails. What is the problem?

A: Increase the following parameters in the ponyprog.ini file (all times are in milliseconds)

   AVRByteWriteDelay=30         'Delay to complete the write of a single word
   AVREraseDelay=100            'Delay to complete the erase of all the memory

   In case of ATmega increase also the following parameter:
   ATMegaPageWriteDelay=50      'Delay to complete the write of a page of flash memory

--------

Q: I can't read or write AT90S1200 device. I receive the error message:
   "Device missing or unknown device -24"

A: Select "Ignore" button, if the final message is "Write successful" you have a sample that
   doesn't reply to the identify command. It seems that early devices don't reply to this command.

--------

Q: I need to program the AVR mounted on the target circuit (In system programming), but PonyProg
   fails to program because an external reset circuit hold the reset line low for a long time.

A: Try to play with the following parameters in the INI file, it should solve the problem (all the
times are in milliseconds)

  SPIResetPulse=100        'How long is the reset pulse generated by PonyProg
  SPIDelayAfterReset=50    'How many milliseconds PonyProg waits after the reset pulse


===============
Other questions
===============

Q: What type of cable I should use to connect SI-Prog to the COM port?

A: You must use "straight through" cable with all 9 pins connected.
   Don't use "null modem" cable. (look at 3.1.10)

--------

Q: With Windows2000/XP I can't access the LPT ports without being administrator, I need to run PonyProg
   logged in as normal user, what can I do?

A: You cannot load the DLPORTIO.SYS driver w/o being an administrator.
   As Administrator, Start the Computer Management console -> Device Manager -> View: show hidden devices.
   Then Expand Non-Plug and Play Drivers and find the driver in the list.
   It may show up as DriverLINX Port I/O Driver.
   Then, for this driver -> properties -> driver startup. Set startup to boot. Reboot the system.

---------

Q: My PC doesn't have any LPT/COM port, can I use a USB2COM or USB2LPT adapter?

A: Some USB adapters don't work at all while other adapters are very slow. So I suggest to avoid USB adapter
   and buy COM/LPT PCMCIA or PCI adapters that emulates 100% native LPT and COM ports.

----------

Q: I have a Windows2000/XP PC with an extra LPT card, but PonyProg can't select the added port, can I force it?

A: First you have to select the AvrISP-I/O interface instead of the API version.
   Then you have to edit ponyprog2000.ini file and disable port autodetection:
   AutoDetectPorts=NO
   then you have to discover the real address of the extra LPT port by looking at
   Computer Management console -> Device Manager -> LPT ports -> resources. For example if the extra LPT is LPT3
   and the address is DF00 you need to enter the line
   LPTPorts=378,278,DF00
   Note that this fix works only in some version (use 2.06g and newer).
tmp9balx013/distribution/innosetup/avr4433fuse.jpg0000644000175000017500000014074113616566001022173 0ustar carstencarstenJFIF``Created with GIMPC  % !###&)&")"#"C """""""""""""""""""""""""""""""""""""""""""""""""""F= Uw/Ժ_voG=|L_2}X}?{n{GR/ɰϋ+&9M|X%:5I]KXMHhSۢ,}|ǖzjmѽy}g*}]=n/,ֽ̢S|kg|vxYԠN,=`Լ$({y?=c==<x7quzG=zx<xxx?k65=R +@{@LJ@=@|B<5] 9(K`=<xr5]>zFl@qqSFx(=xy.vl=`IRc;z5]#[ћ^8;8;8;`:#[ћ^c68X+&i!W%7 2P1eh!>qwNtf׻,NHsOIJfEQK%rP)FKͯw\0\_Fm{FJ,GQj3k}.R`JFjN΋`a.ڷr}.RZ8_L7 FXX2eњFKͫwe+ $E` _ctf׻|rtf/jx2}>RZ_L5O ')MB`31}N#Oћ^#2d'5P@Z!9#!%:.:2r5<]u>)\rrH3c-}^#Oҗ^%X+ŊW-le/t^.W4baG/ަ=bfq)F.։h _eq])u_2 4*.A.>&c\@dd\Gҗ^%ܱX3(۪2\2J% |gbPxY"8;) r.>.Ge_? J 2ْFr]3͓<͏gFrJp]+Q9@@th@rz\}JM{傡l2\a.WKIo c\Ds@rNjxRjXыU+IYɎ}|x숶Hd|yZ4C7*H.ţFLHrxje3>/E,}i.\i|2\}JM[>,k (_N` %PZ;( eӲ`vtJX "1p2ŗ3ǿIwereK/gKғ^傄U] 9"-"Ѣ4H @**D P U-ʗ_ ޗ&i5O揾L6 0<;3 ELǍڠHU*W>d2bElb([ pqzRkbd@hՐ!& *\9|3z\{F}Xdˇ/wKwғ^ pqxzRkb..=JM{>,@2e—;ǽItgLRgt=)5|ɗ _ &џo 2K׺3&\)|3\{F}Xd˅/wK{ғ^Ϸ pqxzRkb..=JM{>,@2e—;ǽItgLRgt=)5|ɗ _ &џo 2K׻.=\|3\{ZHz ֽՀ$&3\{zJ׺#3@v@k$G'pi#83\{W")WqP*R""U,ɠ_qxz^`qxz^`;ǽ{t处j9! b );ǽ{tRN[\4pFxn#H6fy)hle©\2f桦LґcDJ 䄀893\{Lvxr;ǽ{tZ#p@Y9:)I Y1!/A`¡9)`H^pxgt=.$\S8'<,AhHQ/MBvY*Jqxz]kX;ǽww;ǽwpt&bX*\z";ǽwp"٠zz12]AFXg(O !t͔frt=.K +Hsry]g+Z,UKTXN U$B.=K{:NÐqxz];Ǜ` >1!231@ABCP`4 "#$0%wa xev]ev]ev]ev]ev]ev]ev]ev]ev]ev]ev]ev]ev]ev]ev]evM]i^$ dRwyA/O3AߎZoUjZVUjZVU&ؓbDm- PMiJQfzAi&["xbq㰣mVUjZVU@$8]=-VN/ t3LD$N;.>bG)jZVUjZVUjweKt(!+&{{2wʖG{Ȗ|As1uYv;QZVUjZVV&USxȒ I8|yǑ|yǕ|yWǕ|qW|qW|qW|qW|iWƕ|iWƕ|iWƕ|iW|aW|aW|aW|ař|Yř|Yř|Yř|Yř|Yř|YW|aW|aW|aW|aWƕ|iWƕ|iWƕ|iW|qW|qW|qW|qW|yWǕ|yǑ|yǑ7nlVح[bm+lQ%o%K|-[-?pqlm8 l1Fm!@$elz4/?iHtdr Ƙ'b/:@aXme!G;ݶIl%v2r%Kd-[$IldϣhGZ:֎uhGZ:֎uhGZ:֎uhGZ:֎uhGZ:֎uhGZ:֎N;( +lVح[b8튏د[bǿlVبͶK lTx[bm+lVح[bm+lVح[bm+lVح[bm+lVح[bm+lVح[bFk uԻ65Rig,Ekc7Iӟ@UJJ%t`rvgiąp(_<D!jz19zwX]8?Ol[3ɘrȶlޫUjZVUjZVUjZVUjZVTH_ S^F u0@J \PfjbF-zsH#8G-qqXblU KByG\Rh&(va/$YzPARXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQ`?'8e(u 7Xnau 7Xnau 7Xnau 7Xnau 7Xnau 7Xnau 7Xnau 7XnKֺoVn=ՖiA`ǿ2iB/0% l1؍k^}~14UVnf`ƙ@qX # 7i ζG~W?~> Ȝ4eddd")D⚕/r%03֯!zT؛c[!E[KmG٬GbPZd*{r%[6:vz!p}~/A0[[<֯!T|>;sj<\aJV^ƽ=E{E.PH!keZz=_e,oיczF&J#X-ږzĞ"`F%u!-nB5d\S5Ё@7yD7Cw<֮rC0W^#5utҰ4ƁnёP=8,YKδtMmתAZ эl4Z5GDRK^1@L0خZ%;_%bn47O05[A%>:e[߰_^> u9bE@qZ<ٗ+&}Znьի07'`]ZR`Ҁg^fhɧ SڠR3g [נr//RH*G9Ai̖GknE{bs[ f͑q;azEq.i'=$i6ZȜc *=4q.؀Mԥ{5[E.X0, +OJ%j{±1" f`-P?]\CrAGZ#Baㅃgr XN9LiP ?M%*aB  ')/ :}s 5g^0! pt+:Е ( <8`+:#R:mH E}Im1du c(Xt!25s];+BrWQ/EO١-_)~, t"/S\Zd{jߌ=m엊vQ8ѓYF#Xk[h'UR[]m3*q.eU9[16[rH&VbtH+&j?G.5qx1qw1 ' ƕ GO8W*#u rƾC^~ڷ[{%%y<.8?4*a {jߌ}m엏ޯVcocAo>?VcocAk>?VcocAk>?VcocAk>?VcocAk>?VcocAk>?VcocAk>?VcocĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĹĮ^1[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il%Kd-[$Il`xָKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJ#>c[[Yme[Yme[Yme[Ymeյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[Vյm[VյɤӋe%oyc5Fk7)ޮs!^V4NČ[2ZvԷ<1Ț#5Fk㙺3r 9կ;U#>Zϖ (Bf9(JcNjJ ]BPa(B#FqRWDIێ )a;ơ+T%u B SҰd?Z_N~k>j׌}Vs3IJ1NZEF+2đ9lf,nCJ?-XTj׌}bbЪ=qwm7x(q)yf {b yRp^d#)Ǧ<2J'c1 =~ߦ{`ݣT,X3ɝ]FjFtQd0[%.=BtDtF 'y~*~k>Vg_fADDj׌}G/Z_Mx;T3Y̆Zg̃dsSH K> 2;!-kv̎ƱyٙJ"݉]2 MGrzdp̎چlͫq lo~^k>O<$ qnE%Nw%>Gj. !!Qt; jBҪRP*Zpb%gďWf5RH$ J&N *׌}N`/Vck>ĈXb,E"z!\ p.f\ p.\ pp.\ L{"x[U'T>1/P`iڦ~U= 9퉇+bjX{uZjlX^yC̕L筪7nZ Y!8IjZzUa?WQfIe`QaUt=cV+FŜ"BXhkƠ TX9U<($9[TOrjVY`BZV_b~8e-[,Ylem#suι:\t\suι:[n\suι:\{+^1F"heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeX, 6Q3B`q!1A"0 2@RaP?bp WD`p; N 1N5gpb1 E8%țu^U!G 1{`/`?|mBb`~Ȳ0{# IA`#0 ࢀ}@kzѳ# 'P5^}ae/nI/da4^8N'0J/"aY8T`P]'bn/EN·6=OD|0>g"HQDb8"x5_"?rp`!/08qzҋČ0^Xw0pߟ{;0a^Q9>?8"8~*h#z??UkC>O]GT)c XB9PT)c XB9PT)c XB9PT)c XB9P)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c XB9PT)c e=_ugʇ]gʇ]>T< zYl{Gjϕ/n/?^_OC S룵gʇ]>T< zYl{Gjϕc޺;V|xڳC՟*ǽtvP6=룵gʇ]>T< zYl{Gjϕc޺;V|xڳ؃룵gɇGjϓb7՟&o]>L< <޺;V|xytv06 zYalAڳ؃룵gɇGjϓb7՟&o]>L< <޺;V|xytv06 zYalAڳ؃룵gɇGjϓb7՟&o]>L< <޺;V|xytv06 zYalAڳ؃룵gɇGjϓb7՟&o]>L< <޺;V|xytv06=룵gɇ]>L< zYal{Gjϓc޺;V|xڳ՟&ǽtv06=룵gɇ]>L< zYal{Gjϓc޺;V|xڳ՟&xV+bX^>q.ڳ՟&ǽtv06=룵gɇ]BASFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪ4jMSFTѪm@1Qq3B`!1"AR #0@Pa?3ȳşЮ,e3XBҲ=unyBO"0a>4IAr,̂W/@|D>O5tȽJ#'̂MFc3`H?Y<CjyA 2, 8Y~ ̽QOJEFI" m+/!/쯣4,4f%M)PZ?06D #E>"&1DA(xfyl!KdC 5H6|d ˹SSog:v '毾!\n W7nsp+\ W7nsp+\ W7nsp+\ W7nsp+\ W7nsp+\ W7nsp+\ W7nsp+\ W7nsp+\ sp+/j*U?A=~p{QWy_G~dA=~p{QW E_ڊ7~nj*U?A=~p{QW E_ڊ7~nj*U?A=~p{QW E_ڊ~j*U!~}E_|?p{QWU!~}E_|?p{QWU!~}E_|?p{QWU!~}E_|?p{QWU!~}E_|?p{QW~E_ڊ~j*U>=|?p{QW~E_ڊ~j*U>=|?p{QW~E_ڊ~tKR B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\.I $ B!B䐡rHP$(\+ k<C2!13"AQraq# @BPR`0b$CSt?ۀŢ_n4S ۾Qnp&7 Mnp&7 Mnp&7 Mnp&7 Mnp&7 Mnp&7 Mnp&7 Mnp&7 KK5 C׶Ŧw1m3+Nqm1XţMz1^aW\))){5i^-BYlLmG[ +\mп[gz쌈el;ﴺ(mc} F3=܀k|evSٿi\@EIgWQ1M}WVew`mPamQj?&읧nRuV::B;nUv_yUq_l*ikllQV_|PJw} +pȀQųvc˳bpdkb큰1]h |&Ф) a[=hai*w p8Ϳ$0+fI&dfI&dfI&dfI&dfI&dfI&dfI&dfI&djs59Nf3$̓2L3$̓2L3$̓2L3$̓2L3$̓2L3$̓2L3$̓2L3$̓2L"6J~z~r7Mt7Mt0;'d읓vNt? _f;^+5*UE3\u=_#S/R/QYGh1 &Z'UCnΓʟ5o*e :ƪ CR۲i/RN!@vJ5*nMV+ƸpYYNU@ú1[vl2xF9o*7CS gWqT? _oWN+}>k)[ܦV2)LenS+r[=V2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2Sh)D_>^? l6̣9L9L9K;9C9@#ẉ9BL@^(2R逋d9Nsm(&SrG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rG)rn|)~=ZT~bWuhd 㥷jUsIƨ}a)5_˦e v߳0MXZ(c7)UXBE~ҁWkT+ nɳ~:̧^?TlS"-}W+)5+viC~g&WjZj6vfXZߴr }E@hMKZjO76^?U*E6*jqZ"%@6[)14Ew5=gZcr Rjȸ)e%0A5Ԓb[]gd)N*V-MFYz~P\)M\aZFw]`ETBc"R[=zjvPRAP|;c>kh5Ԓo.;@7ߢ|Cߢ쀙YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYe)~=3mf_\; nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېv' nBqېͱ)~=|MZe xw-?PJnTZTu [M]J -0V 򐪕)e2ӪL>z؝ }[ߝji1.PQ7.,pm0#y{S"'{tۘ͗75]U[[.&u\:#uG|CۘuWIj8g'˾iA*cZ&OtS"'{t۔͗8U~q4m nm( ̋ۑJ骓o4WNU84VXzGiT*3 ;mmF.YK5_fm-Q8;e#KKo\#>)u>-!}"UzM6=MyPO~E?9O"xoA7Cp;v ͽ!#v >0mqԪQꛎRT{T7dkJmg ~5-@Jғ=J&wZ`^%)_-*kuEwZb:V(_KCk%ݖ zǩm0OtSv.wv_xH^㢟OFxDO|M31"c6^R* *RDFۍv+|7l|12kcТM!~-AB$n4ʆGB"&Zwmc(l! f{w؀Uzzm*lF=S)=Sv|q\Ie;E) ˉAMjڦXj)=4a,AfSmJ.ԭuJ EN RziEnET\ωH#2' {5_mlwnI־ >r*%qI;vljWccRaO N#y{~q<"'{%IuOS7w:˜w(CJ 4Ԧ3\, F4;6kyGIh`qlNhlh2zHԀfىh#QET{OoĨwS8{6zJc5RX=-m f)bIiڽ8Khim!Ֆ)B TUZWI҆Nm(]&U3H2n67?yЫZMAHr |ҴZk5:8YN7PUTNzCQҫeNuH#HQJ-f:SaUv|EzK>,vƦ5*uSfj]6S$nGz% (Pz\^sBte -MMwnݱj~X@lkG,WWQrNtkTqURU\'}ƥ=-]K1|4VťHYXS5-;yD ۬l>C:C J۽Է] ?bAdAM6av$/˺#T-ܜ?)!{ots#l]178\|RSq'tt24r֨dpSB"M"lLI>pշ]ր D>n[~iO!Qq0XҢ`6o~򡢘MV1"c|8Frͅ |"ku r UT`? OHdjb':)!A7xH^㢟O{lTɞWf8F-s QX)\6#ol-씙y c"Q IOrj.% MgS`u+Qo1)VJUf3b\Pvҭwhm"E1d[ދaOqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD>OqD`M?O8S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2S)2PZОq<# &A2 Ld &A2 Ld &A2 Ld &A2 Ld &A2 Ld &A2 Ld &A2 Ld &A2 Ld 'U@O8ћf&oIf&oIf&oIf&oIo&Io&Io&Io&Io&Io&Io&Io&Io&Io&Io&Io&Io%Оq<"/{T*յQH$PwϺȌik .&Z/`SYK84jzmkl OtmkXJ_.;1lֶKUN*_ֶUAcf_9ISTvOUVSyFrn{C~Rr5nPz^ђ-aEk@ k6B)c˜1FOYzzͭm.ͭk KEf6=@M)jޥKX)ޫ +jafo;ߡÇI&T+oAP Wnk.h4|N.ϏL0 o5JZU+wXFmHS8n픎՜{<#@2DzZVtR`77^V_`8̲ nş)-\ mc/e-5 J(&;`W;JmKL,gmQQQp_mX.v4|N.ϏL0 o5JZU+wXFmHS8n픎՜{<#@2DzZVtR`77^V_`8̤PVfkMYj;lN嬻CОq<"/{l흼n^ "!O8=MR\ f'r>MDZ Qe oCc1ܢ?aA+X\ oH6 |'Ex!1ӣ]-*v)jʸ7Bi|Lю]HzE)KJ VN߈*1F߳+cIK>iX;cl%@&?;~rH:?j(۳a?yDgUN"DqOu_(!njEݻKeFXD:M<_|CPjڥaD ) mM'])V ]R*8|'~yG]7za[lV7)J eﷷJ8XViJϫmncvtҩҦE3 (PzPMpQ{wem}7/lcJޓBwH!۷@2^* 7/e.KmcCoШ56n#|^@~/~|Cߣ}>SiAqu=#-{@,pR|'E~ǔ/Оq<"/{462-Q6j2h.27 CKX0|/ _,:Bo(R]l5j VQJnTwWw8EN`:Ym_ǃ\_uUlmA|ejo Ju SeCwoG_ Tߞ.)**[!p=`_֏]Y-;qӨ~yOVSXtep2 B)ULZÃu,:ůթ`f4WgvV&EŸ^ҵ3LCwAB}Ëg)5uT9*!|'E 3d uTO3J "vyHԩsMl[vZ5ȹ[֋J؁Jvۥ3])|ڛQNEjLpQ)ŇQP^7] : ^[TǻlΘ~%(.>ݿ1$1-E_lVS뎥SSb۳w!>"1 S+JtF#FŃUhlAJMCuI5¨bw| kl.׾ 掸&?y |H'X\b[ 5tk9JwźHTU0+/m&qor.oN[Sd)@pTb,as;z'AѐKi?'~q?8O'gl?.&Ig&Ig!g&Ig&I|6Ig&Ig%~/N qny ƥS`ݍͽ#`| 7~RJ*jP|;v#~rUaR+WEm>*R5'q/M]kjsCךIkI`Vv -F|)PGʢSE P=~0ӥOPpp?^ ?z_?~k:5EW&Wi&ְE\k|F"~4ZSE`C|mS2~bST؂AUwy gD(A?܂>ҴWT`rMYWua.5X.I/)LmkO?7MvJCHՄ1eZ; Оq<#,GaY«} !*py«} !*pyԤT{!:pyë}!:pyë}!쀍:pyë}!:pyë}!:;M:pyë}!:pyë}!vO8qAV+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L2+L"+!1AQaq@P` 0?!,&`'L6B,sF a0@< ̬R/cXF PEQZc>Dָd$L6D(JUX1Z+Nhc\ PA. *W'T0T sE*x*BIP PK0זPP 0igiITPQ<}:DHeRX/r. 0>Gi.eFF"' T`hv8с^8Cj)7 v_/\(yఊHsÔ?+;2WJ~<\$vb1A h|H@KŋBVܬ$c!"Y,x NFHD0o ʉ`URJ `(<(, g/"xZ%U>` .?PzCVk RЈ#31a77777777777777777S77777s7s7s7s777773737#7#7#7#7#7#7#73737s77777s7s7s7s7777S77777777777777777 +wqqqqqqqqqq W)Ӿ5 f3@L&h4 RRU5PMA5PMA5\8888888888Uto8 p$ =FYp-"<Ƚr-W%l PP#ЏWqqqqqrh#h=A0iŊ?rH |oc!&݈3$@ 5J)" 4j6gXe__q~8:.S}M$q(|b-Lj1oɿ&oɿ& ,S}M7S}M7S}M7SuM7TSuM7S}M7S}M7S}M7S}M7S}M7S}M7S}M7 cXM#)d/?XM)8EPw*lʛ*ljM@ =fʅOG)" %M.ʛ*`Kدc6TPDE AD|͕@@MPH3eM6TSeM6TSeM6TSeM6TSeM6TSeM6TSeM6TSeM6TSeM6TSeM6TSeM6Tۂ.Ka5 K@:h J,``FBGx&PAZB ьSV1h75kJ:a rd AB J,uqrTp+m* @ \-j :pPBI 8$xO= ҳXzhW2 ҳ \h>dwJP_3b%FH0țd~DǐCD 1; G#D&ԥX Y ezn&N 6D8`@j,> ӇTj>C٢Up%3kqNx c_`a~c*vh}:GANݤRn%ɵW%!J@3ATZLGU0SW:VBR~XäMD ʰI KRS֫4a5Lu-4^&cVjA:VGU6D"@^D u%ϼExA`%3qx8ĸ @&.@ Y4X6`hV,(G"a#G?@أ@z7B% {GnT* fʺ!JP1<XRAW$B8F8X (zyɇB@`;hA"lJ4J[^;!@ &A[ׁSbH5*J#`Qj؈&.x 9#U8Ŵ9vHG;QJ^7 iE/R|AhA2N8ڧz1}g7~L| KL.)TXC!C\ $U"X8gz9PupIQ!XGˡ@&$@E pf2Eh;`.QHn EqsJ@ fTI7@/K KE3BFihFhe5LITQ֬4 V8ҘWR3PA\p.իiA0|D2V6]b0J!((  :, U> xQ)r@Ri|E*dDŽ,24HT#`HPq8iD b J䓆Tkt3( YT&=D`A@m\CH`<`<@PhS`^zA˔!A٘K9MƓW :^ ỲEF%p27 Yze$0DaYj#( cGبC$[8I A&\p' (u @$u"Pl*(0&F6x;BQ aOA5k+rJLTٳTbKO!{q&KI  `DY`\']5 tpZiYX./1yIMaA!@b *ypuTp L}i fJB ` fiA0lI;&j_2𗡋KL5]0DFXa`9˿>i]Od]w=ZA !`g+" "Bܱ7 W Z>5WEiA5(9('P%a9G((Lj( kb'TTga' kg:rNp ͅ47qbUGŶj\x"n a` B!buEJP'/rj`8&0N`?`6H*k2.BYq,ƒ֤s̓f5PU4 tpZiYjxz.iM?$ҳ _sYH6Ah& CEE b4@W4M,+Cm$Cf  >/4C*+Rمz %`! .<`" I Y w 6Ě_` 0` }O+qh LM$bgB;ڭW oEPv/tR&4bPyJU`k5N@cC1 |(9@@+ kA aNh5XRpL,SHb{APXc]}:Ujt0pQ4 fW-Ulbxz.kMW$蠷Q /\ B$U8I{+mHu{[Ku=Pj'Ex.jMG$ o=?EMC)$gɨe5t _5 t[_&rN 3]d2IAo:^}~욆SQ:H-KϯuPj9'Ix.jMG$ />EMC)$gɨe5t _5 t[_&rN 3]d2IAo:^}~욆SQ+ARAliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƛliƂPϯuP%̎@] {{{{{{ֵkZֵkZ 8nh=:ɨeNe69͎lsc69͎lsc69͎lsc69͎lsc69͎lsc69͎lsc69͎lsc69͎lsc|@& IQ<<9kqf9kqf9kqf9kqfל\^qs.}yϯ8>ל\^qs.}yϯ8>ל\^qs.}yϯ8>ל\^qs.}yϯ8>ל\^qs.}yϯ8>ל\^qs.}yϯ8>ל\z/NjMgJxŰ$p6BPNڂ s :T|w(YҒEp)Ґĭ k05A(;ؒb%Bii[)^@(qB\ $'xP"X$$h\-(CPr R("ъ @PC $ @S!!a![SXX `k #*Q(v$J/8^c(c & dA"NjMg€$GR*CǣB/aG"*)-` +HtHdTBh)[HkRc< $$YTP.c,q0nB50UDg . p%;Kb<B"2DUtG,f#5NokBL!@x). bxJhM+u) jLg@9Cd*ӌec/ F@*AX(Z0uXaC V0k=:ɨe5=?+W/Wȕ|ϗc>lg͌џ*3'zzzzzzzzzzzzzzzzzzzzzzzzzzzzgIϝ#>lg͕|_*Wʕ%r'{~'pzuPk8?h=:ɨe5#f0~SVdRIr$vWa}<C [c  A:UFW݈FXj-YLZUF: /EMC)~7Aϋ\G@pB ~H+c eB5KWp͏ c9Sq:R@pŌa00v0.$c34|a hA+-Zs_f7^RTcexq1<#L"w1r aCe.r:@xPa[jIa/P Ty28x.9ԩcBV5aH7%tR4@\tMnSS'(N_(|"4?D"'k<`~Kz.NjMgvF&M@!懲 QᠷaNӯ욆SY qpzuPk8'PeWgHDr zFK1 $ bNI FlP6NM=]ZQE m]ZCb<) YC#f4v dcYa L XPZI^ЍZo#s0jl[Ix@RH[RU+0r CX#5A-]ZR@ f{G%]~ &j#U.`d v3$D!\[Q $kh-Rx4 23@n &7t-*)\]avjd]ZA(\0L|?Q8| F*Kc4qvP@6C,tUMC)wd:b/2&*\!$/P[bcb-Z h+.B11#jМbjDT+|T[sP,`}4rY0ҥ;& t]aRhtSGBFCLT+M`fA I>"-'Z 2bxذOAǨľp(mi8$c,JRq-a `,ЃBU3q=*eHIqU@Ł)!6: K!٩g_5 Cr*(PBC@@`oA$A$A$A$@ClDIIII ./iƀ7PGIIIIgdE}:ɨe쇥˜3_k5f3_k5f3_k5f3_k5f3_k5f3_k5f3_k5f3_k5f3_k h [mmmmmmmmĉ$I$I50j A$I$j3xpRI$I$LXԁJxI$I.@U-I-[%KlIlKl-[$$H [>}mᄇÁI I' ۼK7m!H$3e}dH@HH7 @=I $H I%$II$I$I$I$!mmmmmmmmmmmmmmmm8#Il,Y$mmmmoi4m$6mmmm #mmmmmmmmR  $I$I$I$I$I$F' I$I$I$I$I$I$I$N\ I I$I$I$I$I$I$OP<$I$I$I$I$I$GT H$I$I$I$I$I$I$EP I$I$I$I$I$I$I$NP H I$ H  I$I$Dt$N H$KI$I$Ep I$I$I$I$I$I$I$Ep 'I$I$I$I$I$I$I$L,$쇐", (YEZ$D "X"7_1U؝g)S7SQ)\L={_r?zFo'a+arq_OUibdX)= B~ di$1 :%;/Q,Ws:}Zp67c(Tk)Xg0wQ2L\G|9A..I[RE{)[$\v^6AIrU8gŃ&(b-ۿ;;-ez'R6tE;V~x6h{5oW_+}qrrq՘RooQi_l ~JR)JR)JQrwlk\ZI\;1&<ż2zc4I,bodI7+W4?MQ./D7'6 RMb{,"mM;+plcPMqI$wyYI1u{AђIŇ!b&M%헾bY*Lo !\J'Vg 4i/l%nݿ)JR)HktO5Kp!WGSD?M/SD?NN)_>SD<+%Ir!rv9MONN)^'ܝSD<(hSD?JDnSD?JnSD<4}>SD<}9;y|0rv9Mar!<4Cyӓh'c/NN)_>SD<}9;y|0rv9Mar!<4Cyӓh'c/NN)]#################################################################}9;y)JR)JR)JR)JR)JR)JR9;!B!B!B!B!B!B!B!B!:v9M;}izR)JR)zR)JRhnN);d!B!B!B!B!B!B!B!B!:v9MVWҗJ_M/y;c3JR)JR)JR)KדhBg'cE'c ~z'c ~Bt!BB!N! g'cu'c|h7 R)zU)JRw)JQ>SEI/rv9Md!BB!.!Bur/4FFFFFFFFGј1LLLL}+&&&&>N)?'bK~<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"s-<"fg=+!1aA` PQ0@q?iaƘ~]L&ER s*s DY(yަ"cKWnǡ ^u[K5 \D.>ndHRcHK3|K7$%cJE"v13t~12CSJFJhw$}ЮpS8:Lg"f%c.P3f o%vTÄ\.#^fbNa%W}hM8\B cЛR\`8M K_ĒB[#øc(X~RE 7Lil/ҙ?ȟc9X.șf%ϒv%3 7L徙b%317!҉LܿnD"}i~M29oe!~!&R71l DK"evu>7%bbe߮$DK_$:J\Hs?zG֖aDDAX8q?D]>,N%t?9?93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL朙93rg4iɜӓ9&sNL期9?9?9?9.a|j=*S!B!j9U5 ?S1c1c1SP(#$ f~!VgST܎ƥST߱&U5MmST܎ƥST܎ƥST܋!B!B!B!B!B!B!B!B1m*6ҩo#&U5MmST܎ÛiT7#6ҩnG=mST܎ÛiT7#mSTGMjBٶMSr;mST6GMjd{JbMj߾ʹ*j#&5M͑m v2MSr=3#YB=PnG ߑe c؈MSr1<ЩnF=5Mǰ[B hT7#m cx-ST܌{*jaඅMSr1<ЩnF=5Mǰ[B hT7#m cx-ST܌lp1c1c1c1c1c1c1c1cLB$!B!B+(T7z5MMSr;MSr;MSr Є!B!B!B!B/B[BB>ġST܋"vv_kcc1c1c15MȲáST܎ơST܋`B!B!B!B!B!B!B!B! 5MRCc;;1cc1cT7z5MMSB!BT7Y}> z1zZ11c,STِ!BB! !Bae BS3=~O1<bxJw'bhj "@ WrD( `I8-K-&K[ ؙw"T9B^L6 (u0ij @"=Yf F]Όw12[ Y).IžR"q5we0t+DUr 1v+8 {q k(Rh!@ +P&RxQLF`k d[! (_ ( AF.Efgʓ7 %I/8&v!X8~*ue!rGut,KEfFKY+''$m&ImE N[4`4-+ 2V\Cg*˝r| DU BAK^PDk_h\pEL.@[Ajڈ}jEW"[sl`QZ9šeuC(1P 1ZnKocڰH4beSb\D`ihQɢ^?r[Ν(XE,[̣PqTX-BC:Nt?~'C:Nt?~'C:Nt?~'C:Nt?~'C:N4^jXІ̇{{{{{{{{FcHlܞ2:!kh ݻv۷nݻv۷nݻv۷nݻv۷nݻv۷nݻv۷nݻv۷nݻv۷3`9Ou@\4:zm`j% {r{s ^UYb)RhM %.d0%hY^P= :X̅M=ORmk naF`sxљ췇*(k<} RǒGUKsT' 4:BNVkaw(YZES<wKLV4 LA+jruJ||, D+*38`6҂eXxL,ņ@BBF`}+JQ`v½(՚񛕔"Bo| JZOuɱrz߹3CWsj[+M rz߹3C–kᖮb=P4:FCT/,v4z"CEC5)` Ӽ qeAt&i\Q) \M=0J E ;5}S R NWKtܡ63Ww@Z*э_<Ǻ {nC>IFļa+m C R/aʴX 0VHKiN3 h|&p=@Ul{(m9KCrlsš`^{K'(|-ʬ HѤ4;X_+`ŠZ I1k!{\6V Zܮ +Ar ʗ>ۂ n8M S]eSݟPRi4qo%}#RA 95X=@*pOìchӀJ+LJENJKܠDkSyőU%xF %`5JNchnI!zRjLV8F"JI6`W%ϻ8{Clk. AZ[^XcXuʷ!)GTbIs~8{NCjVyoy.}\7NSC9V6Nb҄kFUk DQbF1g܊(ĔIKu:(hR@4٠YtN^d6P)S (P-Ce6Qђ5_Au@pW(0쭮}g .g1lf2-\IeYQvXccXyJ#LF4L lp]JEՖHnU pp7a U2 &L$Za^RXH-̳=5xe0mM5M5pCb:hiF@I<\@Ԕ.I(wp4 s`4l DÜ1LahԢn5A3hbI€SuxYj5$hUC?_}\6SC# :7` .%IxaWpJA*4Px_eF啦8=`|ŏcet9k)k BjrըpXe4 j5hLJB4F mg)-&F-V3@4\'\߰Ei&GԋAkW7ȼ[`йa85;䨞ŵ*SJƖIAF:$h[L.M5Vf\VsEQEZس]U 1mmpEXFsiX-4Qi$#t)ŤmtP@յW:UTx!uDW"0sEp-3^i{6g҅LVcн?R,#oJ-1Ml h-"+ՇOFht̉KV.n~Xm\j+e!mMPMKs+1{ ehtPWp*c( b2F: xj..ºk84"t7X&JÐT =P "dH,Zpqa!#V)_]u }.Ʉ\2`eL!kV/nO/*˶X0-*6ʉBB}`G*4cP#5p`ia(YUuS/ ΀@Ul1) ѪA0 Xn}^ [LY,jD/TMV2vb*(fRІ̂%Lx0^6 ͟araEvgm(N)n) Ht) ;-F@VmW@ނFR U(D6`N=ytZU^ʑZ!?cBfi.eyh%:>)ZEn3X$ZB*:,7P*y*>0CJqql]mYN" ڊ=m̵WyJCs9ie**WWT۹b?=@tLT@Q -6w H[nj;rz%pMJp.`Up7Z"e$ItV+yUjZuB%C(4$j_0H:QYѼ%l$[P.*a똀GEUQ)szks@\VaDˆB] H<\`jiKS1ei_* ђ3@mC8Kv͠',9nwt] Yje\A,,#TH QF#y#G$չ̈́T=e.ª R eϒgB(B$lh)8VHV㛲Cls)u]^e*EpPQdA*ۮkM 4:incM;w;/OM~oۿ)}2}ht}NSCvv>_L?4C~Sd򝏗'O?M7ߔ|>4:incM;w;/OM~oۿ)}2FUg=6y{ͳmlg=6y{ͳmlg=6y{ͳmlg=6y{ͳmlg=6y{ͳmlg=6y{ͳmlg=6y{ͳmlg=6y{ͳml);w;,tZ_0O*UY4     888888888888k0-8Sw;,gmA П쪎WBu?a4YQ~~0jhƹt{0h)eKXW[ BMJ`RPyjP l DP@Y6ބ6*)]B r@8Q3K7WjLd8dSݹWpm -.X+f * JgI{c:^S nk*GRX*Y̴}eUu.XmԪ e%UK oU mOh ?B٤0@ B+9Z(g(%mA]mM*>?}G򝏖3`iқrankcV~AӀB @nSEz|+xnBf9 f(,9JFF-FHA^C$$Mkw;,}<ϼ'gKԽ/dKؿRٝ6iMmkv}a @ @ @,]6iM^~_{^~Է[3f}=>N˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗.\r˗~SyymP5y_?wҵ./0_b-i-[LՕ.\6ZV}XE+C1-U_/)9X.\r˗.\r˗.\s ׾%"/?D0H8li}F`/C2PX pZ5 ^Vs.\r˗.\r˗.\r˗.\~w;,g&|RuZ!a> +MSGLeF44 IeVf/l*#̾dX5} .PhtUC[V ,C,19hqD.H &lG  YVj˨Wpld,. k<ЭSLKk4߃ 8Tм f(E5l_)2ʭ/t*UP1BސUX6eA6*Ӫ]0DQFÒ+d,i|%6{n S@]FF]#8'UiVjh c99瑟C-۰^3*1U,Bځ'Mϭʘn# mX%& A +& pS7סdzQԋˢuU%e@@Qi~K/_i~K/_i~K/_i~=ߔ|e\.tg]h,4ZsH=T)QP 4@v>X.jw;,gCB$0y4BmK[.Dhb S$DbIqr- uKPY8x+.p%BzkD=giG5ږQ#`KO B(./ qBW.g$^-ZDv^̀ غO:hKŦKdi-wt JYX35ӯ~SS}bK5*/ɔNbE\0:w ^\ &jn\`2b,@Υ:Ru*{LT=cj,%%Gj%rÅ`6@g5n i~ jȃPы| q Õxep7 Κfkk9TP4]9/yjN=­bLOc,VCF\x25ҽBewfATJ-t3mgJsU"jAhQ) {-pp[əU-[~NZP 8mpUT_) }]JȟЇBt!ЇBt KK .V X+`VtZg1][,V X+`E>`:PZ1S앂V X+` H 8Sw;/TU 5( -ܰͅk)4Tx&Am*$a 9z/blz!Y-_av- ~  .ũC` @/dP}wit2 x}Y2K*p.3P1 NQse] 9 *jlKXZM /߮@8Ah]XWƶJ*S=w;/UZ3j*O:4[A:!dh4:XhQPepT:&ÖV jhs?r_oP' k5%4Tfi@I, K.СcDL޸¨v''ь;NdI @au+@…'xH |k1뱅K(i%K૵Q U%p Cz.9JV4q5 yxX/<`F0xשE)bBY\ϟ>tea9a Vf`@[H(:g/ ${PONYPROG_BINARY_DIR}/ChangeLog WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} ) SET( CPACK_SOURCE_PACKAGE_FILE_NAME "ponyprog-${APP_VERSION}" ) # --- Package generation # SET( CPACK_BUILD_CONFIG "Release_and_Debug" ) # SET( CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) SET( CPACK_PACKAGE_VENDOR "Lancos" ) SET( CPACK_PACKAGE_INSTALL_DIRECTORY "PONYPROG ${APP_VERSION}" ) SET( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "PONYPROG ${APP_VERSION}" ) SET( CPACK_PACKAGE_HOMEPAGE "http://ponyprog.sourceforge.net/" ) # Setup global packaging parameters ... SET( PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS "${CURRENT_BUILD_DIR};ponyprog;ALL;/" ) # MESSAGE("PONYPROG_BINARY_DIR ${CURRENT_BUILD_DIR}") # SET( PONYPROG_CPACK_PACKAGE_DESCRIPTION "Ponyprog free GUI for EEPROM and microcontroller flashing." ) SET( PONYPROG_CPACK_PACKAGE_FILE_NAME "ponyprog-setup-${APP_VERSION}" ) SET( PONYPROG_CPACK_PACKAGE_VERSION "${APP_VERSION}" ) SET( PONYPROG_CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE" ) SET( PONYPROG_CPACK_SOURCE_INSTALLED_DIRECTORIES "${PROJECT_SOURCE_DIR};/" ) SET( PONYPROG_CPACK_SOURCE_PACKAGE_FILE_NAME "ponyprog-source-${APP_VERSION}" ) SET( PONYPROG_CPACK_SOURCE_IGNORE_FILES "/\\\\.svn/" "/\\\\.kdev4/*" "/\\\\.git/*" "/pics/" "/build*/*" "\\\\.deb" "\\\\.rpm" "\\\\.zip" "\\\\.kdev4" "/cppreport" "/ponyprog$" # "~$" # "/ponyprog" # "TODO.txt" # "CMakeLists.txt.user" # "/doxygen/" # "${CMAKE_BINARY_DIR}" ) SET( PONYPROG_CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME} ) # SET( PONYPROG_CPACK_PACKAGE_VERSION ${APP_VERSION} ) SET( PONYPROG_CPACK_PACKAGE_RELEASE 0 ) SET( PONYPROG_CPACK_PACKAGE_MAINTAINER "${APP_AUTHOR} <${APP_EMAIL}>" ) SET( PONYPROG_CPACK_PACKAGE_MAINTAINER_NAME "${APP_AUTHOR}" ) SET( PONYPROG_CPACK_PACKAGE_MAINTAINER_EMAIL "${APP_EMAIL}" ) SET( PONYPROG_CPACK_PACKAGE_DESCRIPTION "EEPROM and microcontroller flasher" ) SET( PONYPROG_CPACK_PACKAGE_DESCRIPTION_SUMMARY "EEPROM and microcontroller flasher for PIC, Atmega and other chips" ) # SET( PACKAGE_DEPENDS ${hugr_dependencies} ) SET( PONYPROG_CPACK_PACKAGE_DEPENDS "${PONYPROG_CPACK_PACKAGE_SHLIBDEPS}" ) #SET( PONYPROG_CPACK_PACKAGE_DEPENDS "libusb-1.0-0, libftdi1-2, libftdipp1-3, libqt5core5a, libqt5gui5, libqt5widgets5, libqt5multimedia5, libqt5printsupport5" ) # SET( PACKAGE_DEPENDS "libc6 (>= 2.1.3), libqtcore4 (>= 4:4.6.1), libqtgui4 (>= 4:4.5.3), libstdc++6 (>= 4.1.1)" ) # SET( PONYPROG_CPACK_PACKAGE_GROUP "Groupe" ) SET( PONYPROG_CPACK_PACKAGE_LICENSE "GPL2" ) # ADD_CUSTOM_TARGET(changelog # COMMAND ${GITCOMMAND} log > ${PONYPROG_BINARY_DIR}/ChangeLog # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} # ) # Setup convenience targets for tagging and branching # SET( PONYPROG_VERSION_TAG "ponyprog-${PONYPROG_MAJOR_VERSION}.${PONYPROG_MINOR_VERSION}.${PONYPROG_RELEASE_VERSION}.${PONYPROG_BUILD_VERSION}" ) # SET( PONYPROG_VERSION_TAG "ponyprog-${PONYPROG_VERSION}" ) # ADD_CUSTOM_TARGET(tag-version # COMMAND ${GITCOMMAND} tag ${PONYPROG_VERSION_TAG} # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} # ) #SET( PONYPROG_BRANCH_TAG "ponyprog-release-${PONYPROG_MAJOR_VERSION}.${PONYPROG_MINOR_VERSION}" ) #ADD_CUSTOM_TARGET(tag-branch # COMMAND ${SVNCOMMAND} cp ${PONYPROG_SVN_TRUNK} # ${PONYPROG_SVN_BRANCHES}/${PONYPROG_BRANCH_TAG} -m "COMP: Branched PONYPROG Version ${PONYPROG_MAJOR_VERSION}.${PONYPROG_MINOR_VERSION}" # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} # ) # MESSAGE("CMAKE_CURRENT_SOURCE_DIR distr ${CMAKE_CURRENT_SOURCE_DIR} : ${PROJECT_SOURCE_DIR}") # Get a SourceForge username so we can upload distributables to the FRS # IF(WIN32) # SET( PONYPROG_SOURCEFORGE_USERNAME "$ENV{USERNAME}" CACHE STRING "SourceForge user account name, for uploading distribution files." ) # ELSE(WIN32) # SET( PONYPROG_SOURCEFORGE_USERNAME "$ENV{USER}" CACHE STRING "SourceForge user account name, for uploading distribution files." ) # ENDIF(WIN32) # MARK_AS_ADVANCED(PONYPROG_SOURCEFORGE_USERNAME) # Setup some macros that can be used by the platform-specific distribution logic MACRO(PONYPROG_CHECK_INSTALLED_VERSION FOUND PACKAGE EXPECTED) IF(NOT ${FOUND} STREQUAL ${EXPECTED}) MESSAGE(SEND_ERROR "Found ${PACKAGE} version ${FOUND} - for installation, version ${EXPECTED} is required." ) ENDIF(NOT ${FOUND} STREQUAL ${EXPECTED}) ENDMACRO(PONYPROG_CHECK_INSTALLED_VERSION) # IF(UNIX AND NOT APPLE) # SET(CPACK_STRIP_FILES TRUE) # # SET(CPACK_SET_DESTDIR "ON") # SET(CPACK_INSTALL_PREFIX "/usr") # SET(CPACK_PACKAGE_INSTALL_DIRECTORY "/usr") # ENDIF(UNIX AND NOT APPLE) # Generate source packages ADD_SUBDIRECTORY(source) # Generate platform-specific binary packages IF(APPLE) ADD_SUBDIRECTORY(osx) ENDIF(APPLE) IF(UNIX AND NOT APPLE) ADD_SUBDIRECTORY(posix) ENDIF(UNIX AND NOT APPLE) IF(WIN32) ADD_SUBDIRECTORY(win32) ENDIF(WIN32) # INCLUDE(CPack) tmp9balx013/distribution/source/0000755000175000017500000000000013616566001016745 5ustar carstencarstentmp9balx013/distribution/source/CMakeLists.txt0000644000175000017500000000226213616566001021507 0ustar carstencarstenSET(PONYPROG_PACKAGE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/PonyProg-${APP_VERSION}") FILE(MAKE_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}") # SET (CPACK_SOURCE_IGNORE_FILES "${PONYPROG_CPACK_SOURCE_IGNORE_FILES}") # Generate source packages CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-tbz2.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-tbz2.cpack) ADD_CUSTOM_TARGET(package-source-tbz2 WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config "${CMAKE_CURRENT_BINARY_DIR}/package-source-tbz2.cpack" ) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-tgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-tgz.cpack) ADD_CUSTOM_TARGET(package-source-tgz WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config "${CMAKE_CURRENT_BINARY_DIR}/package-source-tgz.cpack" ) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-source-zip.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-source-zip.cpack) ADD_CUSTOM_TARGET(package-source-zip WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config "${CMAKE_CURRENT_BINARY_DIR}/package-source-zip.cpack" ) # INCLUDE(CPack) tmp9balx013/distribution/source/package-source-zip.cpack.in0000644000175000017500000000074613616566001024055 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "ZIP") SET(CPACK_IGNORE_FILES "${PONYPROG_CPACK_SOURCE_IGNORE_FILES}") SET(CPACK_INSTALLED_DIRECTORIES "${PONYPROG_CPACK_SOURCE_INSTALLED_DIRECTORIES}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_SOURCE_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") tmp9balx013/distribution/source/package-source-tbz2.cpack.in0000644000175000017500000000074713616566001024135 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "TBZ2") SET(CPACK_IGNORE_FILES "${PONYPROG_CPACK_SOURCE_IGNORE_FILES}") SET(CPACK_INSTALLED_DIRECTORIES "${PONYPROG_CPACK_SOURCE_INSTALLED_DIRECTORIES}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_SOURCE_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") tmp9balx013/distribution/source/package-source-tgz.cpack.in0000644000175000017500000000074613616566001024057 0ustar carstencarstenSET(CPACK_GENERATOR "TGZ") SET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_IGNORE_FILES "${PONYPROG_CPACK_SOURCE_IGNORE_FILES}") SET(CPACK_INSTALLED_DIRECTORIES "${PONYPROG_CPACK_SOURCE_INSTALLED_DIRECTORIES}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_SOURCE_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") tmp9balx013/distribution/posix/0000755000175000017500000000000013616566001016607 5ustar carstencarstentmp9balx013/distribution/posix/package-binary-rpm.cpack.in0000644000175000017500000000174213616566001023674 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "RPM") SET(CPACK_PACKAGE_MAINTAINER "${PONYPROG_CPACK_PACKAGE_MAINTAINER}") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PONYPROG_CPACK_PACKAGE_DESCRIPTION_SUMMARY}") SET(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/packaging/rpm-script/postinst.sh") SET(CPACK_RPM_PACKAGE_SHLIBDEPS "${PONYPROG_CPACK_PACKAGE_SHLIBDEPS}") SET(CPACK_RPM_PACKAGE_REQUIRES "${PONYPROG_CPACK_PACKAGE_DEPENDS}") #MESSAGE("CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} : ${PONYPROG_CPACK_PACKAGE_DEPENDS}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${PONYPROG_CPACK_RESOURCE_FILE_LICENSE}") tmp9balx013/distribution/posix/CMakeLists.txt0000644000175000017500000001437413616566001021360 0ustar carstencarstenSET(CPACK_STRIP_FILES TRUE) SET(CPACK_SET_DESTDIR "ON") SET(CPACK_INSTALL_PREFIX "/usr") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "/usr") INCLUDE(GNUInstallDirs) MESSAGE("UDEV_INSTALL_DIR ${UDEV_INSTALL_DIR}") #SET(UDEV_INSTALL_DIR "/usr/lib/udev/rules.d") IF(NOT EXISTS "${UDEV_INSTALL_DIR}" OR NOT IS_DIRECTORY "${UDEV_INSTALL_DIR}") SET(UDEV_INSTALL_DIR "/lib/udev/rules.d") ENDIF() MESSAGE("CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}") # SET( CPACK_PACKAGE_GROUP "${PONYPROG_CPACK_PACKAGE_GROUP}" ) SET( CPACK_PACKAGE_LICENSE "${PONYPROG_CPACK_PACKAGE_LICENSE}" ) SET( CPACK_PACKAGE_SHLIBDEPS "${PONYPROG_CPACK_PACKAGE_SHLIBDEPS}" ) # SET( CPACK_PACKAGE_DEPENDS "${PONYPROG_CPACK_PACKAGE_DEPENDS}" ) INSTALL(PROGRAMS "${CURRENT_BUILD_DIR}/ponyprog" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT "application" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/icons/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons" COMPONENT "application" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.png" ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/lang/" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/ponyprog/lang/" COMPONENT "lang files" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.utf" ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/distribution/innosetup/" DESTINATION "${CMAKE_INSTALL_DOCDIR}" COMPONENT "help files" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.jpg" PATTERN "*.html" ) INSTALL(FILES "${PROJECT_SOURCE_DIR}/copyright" DESTINATION "${CMAKE_INSTALL_DOCDIR}" COMPONENT "application" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ ) # MESSAGE("PROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR}") INSTALL(FILES "${PROJECT_SOURCE_DIR}/udev/rules.d/90-ponyprog.rules" DESTINATION "${UDEV_INSTALL_DIR}" COMPONENT "application" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ ) INSTALL(FILES "${PROJECT_SOURCE_DIR}/desktop/ponyprog.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications/" COMPONENT "application" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ ) SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(PONYPROG_PACKAGE_DIRECTORY "${CURRENT_BUILD_DIR}") SET( CPACK_PACKAGE_VENDOR "Lancos" ) # FILE(MAKE_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}") # MESSAGE("CMAKE_CURRENT_SOURCE_DIR posix ${CMAKE_CURRENT_SOURCE_DIR}") # MESSAGE("DIR: ${CMAKE_CURRENT_SOURCE_DIR}") SET(CPACK_COMPONENTS_ALL "application" "lang files" "help files") SET(CPACK_COMPONENTS_INSTALL "ON") # if not defined IF(NOT DEBIAN_ARCHITECTURE) execute_process( COMMAND dpkg --print-architecture OUTPUT_VARIABLE DEBIAN_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE ) #SET(DEBIAN_ARCHITECTURE i386) #dpkg --print-architecture is always i386 on intel ENDIF(NOT DEBIAN_ARCHITECTURE) IF(DEBIAN_ARCHITECTURE) MESSAGE("DEBIAN_ARCHITECTURE ${DEBIAN_ARCHITECTURE}") SET( PONYPROG_CPACK_PACKAGE_FILE_NAME "ponyprog-${APP_VERSION}-${DEBIAN_ARCHITECTURE}" ) SET(DEBIAN_POSTINST postinst.in) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-deb.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-deb.cpack) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${DEBIAN_POSTINST} ${CMAKE_CURRENT_BINARY_DIR}/packaging/debian-control/postinst) ADD_CUSTOM_TARGET(package-binary-deb WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-deb.cpack ) ENDIF() IF(NOT DEBIAN_ARCHITECTURE) FIND_PROGRAM(RPMBUILD NAMES rpmbuild PATHS "/usr/bin") IF ( RPMBUILD ) GET_FILENAME_COMPONENT(RPMBUILD_PATH ${RPMBUILD} ABSOLUTE) MESSAGE(STATUS "Found rpmbuild : ${RPMBUILD_PATH}") SET(RPMBUILD_FOUND "YES") execute_process( COMMAND arch OUTPUT_VARIABLE RPM_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE ) ENDIF ( RPMBUILD ) ENDIF() IF(RPM_ARCHITECTURE) MESSAGE("RPM_ARCHITECTURE ${RPM_ARCHITECTURE}") SET( PONYPROG_CPACK_PACKAGE_FILE_NAME "ponyprog-${APP_VERSION}-${RPM_ARCHITECTURE}" ) SET( RPM_POSTINST postinst.in) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-rpm.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-rpm.cpack) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${RPM_POSTINST} ${CMAKE_CURRENT_BINARY_DIR}/packaging/rpm-script/postinst.sh) ADD_CUSTOM_TARGET(package-binary-rpm WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-rpm.cpack ) ENDIF() # Generate self-extracting tarballs CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-stgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-stgz.cpack) ADD_CUSTOM_TARGET(package-binary-stgz WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-stgz.cpack ) # Generate tarballs CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-tbz2.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tbz2.cpack) ADD_CUSTOM_TARGET(package-binary-tbz2 WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tbz2.cpack ) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-tgz.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tgz.cpack) ADD_CUSTOM_TARGET(package-binary-tgz WORKING_DIRECTORY "${PONYPROG_PACKAGE_DIRECTORY}" COMMAND ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-tgz.cpack ) # Note ... we intentionally don't provide upload capability for Posix packages, and leave distribution to the experts # INCLUDE(CPack) tmp9balx013/distribution/posix/package-binary-stgz.cpack.in0000644000175000017500000000074613616566001024070 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "STGZ") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${PONYPROG_CPACK_RESOURCE_FILE_LICENSE}") tmp9balx013/distribution/posix/package-binary-tbz2.cpack.in0000644000175000017500000000074613616566001023762 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "TBZ2") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${PONYPROG_CPACK_RESOURCE_FILE_LICENSE}") tmp9balx013/distribution/posix/package-binary-tgz.cpack.in0000644000175000017500000000074513616566001023704 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "TGZ") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${PONYPROG_CPACK_RESOURCE_FILE_LICENSE}") tmp9balx013/distribution/posix/postinst.in0000755000175000017500000000045213616566001021026 0ustar carstencarsten#!/bin/sh # errors shouldn't cause script to exit set +e #only get the real usernames for usrnm in $(cat /etc/passwd | grep /home | grep -v false | cut -d':' -f1); do usermod -a -G dialout $usrnm done #setcap 'cap_sys_tty_config=+ep' /usr/bin/ponyprog # clear error termination state set -e tmp9balx013/distribution/posix/package-binary-deb.cpack.in0000644000175000017500000000220513616566001023623 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}") SET(CPACK_GENERATOR "DEB") SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "${PONYPROG_CPACK_PACKAGE_MAINTAINER}") SET(CPACK_INSTALL_CMAKE_PROJECTS "${PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS}") SET(CPACK_PACKAGE_VENDOR "${PONYPROG_CPACK_PACKAGE_VENDOR}") SET(CPACK_PACKAGE_DESCRIPTION "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PONYPROG_CPACK_PACKAGE_DESCRIPTION}\n ${PONYPROG_CPACK_PACKAGE_DESCRIPTION_SUMMARY}") SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_BINARY_DIR}/packaging/debian-control/postinst") SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "${PONYPROG_CPACK_PACKAGE_SHLIBDEPS}") #SET(CPACK_DEBIAN_PACKAGE_DEPENDS "${PONYPROG_CPACK_PACKAGE_DEPENDS}") #SET(DEBIAN_PACKAGE_BUILDS_DEPENDS "cmake, libusb2-dev") #SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}-${DEBIAN_ARCHITECTURE}") SET(CPACK_PACKAGE_FILE_NAME "${PONYPROG_CPACK_PACKAGE_FILE_NAME}") SET(CPACK_PACKAGE_NAME "${PONYPROG_CPACK_PACKAGE_NAME}") SET(CPACK_PACKAGE_VERSION "${PONYPROG_CPACK_PACKAGE_VERSION}") SET(CPACK_RESOURCE_FILE_LICENSE "${PONYPROG_CPACK_RESOURCE_FILE_LICENSE}") tmp9balx013/distribution/win32/0000755000175000017500000000000013616566001016407 5ustar carstencarstentmp9balx013/distribution/win32/nsis/0000755000175000017500000000000013616566001017363 5ustar carstencarstentmp9balx013/distribution/win32/nsis/CMakeLists.txt0000644000175000017500000000563113616566001022130 0ustar carstencarsten# Generate NSIS installer SET(bin_dir .) SET(lib_dir .) SET(lang_dir ./lang/) SET(help_dir .) SET(license_dir .) SET(CPACK_GENERATOR NSIS ZIP) # set(CPACK_PACKAGE_INSTALL_DIRECTORY "${ROBOMONGO_DISPLAY_FULL_NAME}") FUNCTION(INSTALL_QT_LIBS) FOREACH(module ${ARGV}) SET(target_name Qt5::${module}) SET(module_name Qt5${module}) # Get full path to some known Qt library (i.e. /path/to/lib/libQt5Widgets.so.5.5.1) GET_TARGET_PROPERTY(target_path Qt5::Core LOCATION) # Get folder path of library (i.e. /path/to/lib) GET_FILENAME_COMPONENT(qt_lib_dir ${target_path} DIRECTORY) # Install single DLL to lib directory INSTALL(FILES ${qt_lib_dir}/${module_name}${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${lib_dir} ) ENDFOREACH() ENDFUNCTION() INSTALL(PROGRAMS "${CURRENT_BUILD_DIR}/ponyprog.exe" DESTINATION ${bin_dir} COMPONENT "application" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/icons/" DESTINATION ${bin_dir} COMPONENT "application" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.png" ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/lang/" DESTINATION ${lang_dir} COMPONENT "lang files" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.utf" ) INSTALL(DIRECTORY "${PROJECT_SOURCE_DIR}/distribution/innosetup/" DESTINATION ${help_dir} COMPONENT "help files" DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ FILES_MATCHING PATTERN "*.jpg" PATTERN "*.html" ) INSTALL(FILES "${PROJECT_SOURCE_DIR}/InpOutLib/Win32/inpout32.dll" DESTINATION ${bin_dir} COMPONENT "driver" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) INSTALL(FILES "${PROJECT_SOURCE_DIR}/InpOutLib/InstallDriver/InstallDriver.exe" DESTINATION ${bin_dir} COMPONENT "driver" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) INSTALL_QT_LIBS(Core Gui Widgets PrintSupport Multimedia) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-nsis.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-nsis.cpack) ADD_CUSTOM_TARGET(package-binary-nsis ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-nsis.cpack ) # INCLUDE(CPack) tmp9balx013/distribution/win32/nsis/package-binary-nsis.cpack.in0000644000175000017500000000242313616566001024623 0ustar carstencarstenSET(CPACK_STRIP_FILES TRUE) SET(CPACK_CMAKE_GENERATOR "@CMAKE_GENERATOR@") SET(CPACK_GENERATOR "NSIS") SET(CPACK_INSTALL_CMAKE_PROJECTS "@PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS@") SET(CPACK_NSIS_HELP_LINK "http://ponyprog.sourceforge.net/") SET(CPACK_NSIS_INSTALLED_ICON_NAME "ponyprog.exe") SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") SET(CPACK_NSIS_MENU_LINKS "http://ponyprog.sourceforge.net/" "Ponyprog Help") SET(CPACK_NSIS_MUI_ICON "@PROJECT_SOURCE_DIR@/icons/ponyprog.ico") SET(CPACK_PACKAGE_DESCRIPTION "@PONYPROG_CPACK_PACKAGE_DESCRIPTION@") SET(CPACK_PACKAGE_EXECUTABLES "ponyprog" "Ponyprog @APP_VERSION@") SET(CPACK_PACKAGE_FILE_NAME "@PONYPROG_CPACK_PACKAGE_FILE_NAME@") #SET(CPACK_PACKAGE_ICON "@CMAKE_CURRENT_SOURCE_DIR@\\\\headerimage.bmp") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "@APP_NAME@") SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "Software\\\\@APP_NAME@") SET(CPACK_PACKAGE_NAME "@PONYPROG_CPACK_PACKAGE_NAME@") SET(CPACK_NSIS_PACKAGE_NAME "Ponyprog") SET(CPACK_PACKAGE_VENDOR "http://ponyprog.sourceforge.net/") SET(CPACK_PACKAGE_VERSION "@PONYPROG_CPACK_PACKAGE_VERSION@") SET(CPACK_RESOURCE_FILE_LICENSE "@PONYPROG_CPACK_RESOURCE_FILE_LICENSE@") SET(CPACK_NSIS_MODIFY_PATH "ON") SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@") tmp9balx013/distribution/win32/inno/0000755000175000017500000000000013616566001017352 5ustar carstencarstentmp9balx013/distribution/win32/inno/CMakeLists.txt0000644000175000017500000000044713616566001022117 0ustar carstencarsten# Generate InnoSetup installer CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/package-binary-inno.cpack.in ${CMAKE_CURRENT_BINARY_DIR}/package-binary-inno.cpack) ADD_CUSTOM_TARGET(package-binary-inno ${CMAKE_CPACK_COMMAND} --config ${CMAKE_CURRENT_BINARY_DIR}/package-binary-inno.cpack ) tmp9balx013/distribution/win32/inno/package-binary-inno.cpack.in0000644000175000017500000000234013616566001024577 0ustar carstencarstenSET(CPACK_CMAKE_GENERATOR "@CMAKE_GENERATOR@") SET(CPACK_GENERATOR "INNOSETUP") SET(CPACK_INSTALL_CMAKE_PROJECTS "@PONYPROG_CPACK_INSTALL_CMAKE_PROJECTS@") SET(CPACK_INNO_HELP_LINK "http://ponyprog.sourceforge.net/") SET(CPACK_INNO_INSTALLED_ICON_NAME "bin\\\\ponyprog.exe") SET(CPACK_INNO_MENU_LINKS "http://ponyprog.sourceforge.net/" "Ponyprog Help") SET(CPACK_INNO_MUI_ICON "@share_SOURCE_DIR@/icons\\\\ponyprog.ico") SET(CPACK_PACKAGE_DESCRIPTION "@PONYPROG_CPACK_PACKAGE_DESCRIPTION@") SET(CPACK_PACKAGE_EXECUTABLES "ponyprog" "Ponyprog @APP_VERSION@") SET(CPACK_PACKAGE_FILE_NAME "@PONYPROG_CPACK_PACKAGE_FILE_NAME@") #SET(CPACK_PACKAGE_ICON "@CMAKE_CURRENT_SOURCE_DIR@\\\\headerimage.bmp") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "Ponyprog @APP_VERSION@") SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "Ponyprog @APP_VERSION@") SET(CPACK_PACKAGE_NAME "@PONYPROG_CPACK_PACKAGE_NAME@") SET(CPACK_INNO_PACKAGE_NAME "Ponyprog") SET(CPACK_PACKAGE_VENDOR "http://ponyprog.sourceforge.net/") SET(CPACK_PACKAGE_VERSION "@PONYPROG_CPACK_PACKAGE_VERSION@") SET(CPACK_RESOURCE_FILE_LICENSE "@PONYPROG_CPACK_RESOURCE_FILE_LICENSE@") SET(CPACK_INNO_MODIFY_PATH "ON") #SET(CPACK_INNO_EXTRA_INSTALL_COMMANDS "@CPACK_INNO_EXTRA_INSTALL_COMMANDS@") tmp9balx013/distribution/win32/CMakeLists.txt0000644000175000017500000000011313616566001021142 0ustar carstencarsten# add the inno subdir ADD_SUBDIRECTORY(inno) ADD_SUBDIRECTORY(nsis) tmp9balx013/lang/0000755000175000017500000000000013616566001013647 5ustar carstencarstentmp9balx013/lang/francais.utf0000644000175000017500000002332713616566001016164 0ustar carstencarstenLANGUAGE_NAME francais LANGUAGE_CHARSET UTF-8 t0=Français t1=Traduction de : t2=Michael Mathieu\nJean-Jacques Michel\nChauvet Christophe\nJean-Paul Brodier\n t3=Programmateur de composants par liaison série t4=Télécharger la dernière version t5=à l'adresse : t6=Sans nom //Button captions t7=OK t8=Annuler t9=Aide t10=Tester t12=Note t13=Editer //Dialog messages t14=Version t15=Oui t16=Non t17=Ok t18=Test t19=Echec t20=A propos t21=Page t22=Inconnu t23=Le tampon \"%s\"a changé. Le sauver avant de quitter ? t24=Le tampon a changé. Le sauver avant d'ouvrir ? t25=Rien à enregistrer t26=Rien à lire t27=Rien à imprimer t28=Rien à écrire t29=Rien à vérifier t30=Calibrage temporel du PC.\nAssurez-vous qu'aucune application ne tourne autre que t31=\n(le processeur et le disque dur doivent être inoccupés)\nLe calibrage dure quelques secondes.\nVoulez-vous la lancer maintenant? t32=Calibrage réussi t33=Echec calibrage t34=Vous devez lancer un calibrage depuis le menu Options \navant d'effectuer des opérations de lecture ou d'écriture t35=Vous devez configurer le système depuis le menu Options \navant d'effectuer des opérations de lecture ou d'écriture t36=Lecture... t37=Lecture réussie\nTaille composant: t38=Etes vous sûr de vouloir écrire le composant?\nSon contenu sera définitivement perdu t39=Ecriture... t40=Vérification... t41=Ecriture réussie t42=Echec écriture t43=Effacement... t44=Effacement réussi //t40=Vérification t45=Vérification impossible, composant absent ou mauvais composant t46=Vérification réussie t47=Echec vérification t48=Programmation réussie t49=Echec programmation t50=Mise à zéro composant t51=Ecriture bits de sécurité... t52=Echec écriture bits de sécurité t53=Lecture bits de sécurité... t54=Echec lecture bits de configuration t55=Lecture bits de configuration ... t56=Echec lecture bits de configuration t57=Ecriture bits de configuration ... t58=Echec écriture bits de configuration t64=Tampon vide t65=Opération non supportée t66=Insérer paramètres t67=Mauvais paramètres t68=Commande acceptée... t69=Ouvrir fichier composant t72=Fichier non trouvé t73=Echec sauvegarde fichier t74=Sauvegarder fichier composant sous t75=Sauvegarder fichier programme (FLASH) sous t76=Sauvegarder fichier données (EEPROM) sous t77=Dernière fenêtre fermée : Voulez-vous quitter ? t78=Le tampon a changé. Le sauvegarder avant de fermer ? //Menu entries //Main Menu t80=&Fichier t81=&Edition t82=Co&mposant t83=C&ommande t85=&Utilitaire t86=&Configuration t87=&Options t88=&? //Menu File t89=&Nouvelle fenêtre t90=&Ouvrir ... t91=Ouvrir fichier &programme (FLASH)... t92=Ouvrir fichier &données (EEPROM)... t93=&Sauvegarder t94=Sa&uvegarder sous ... t95=Sauvegarder fichier programme (F&LASH) sous... t96=Sauvegarder fichier données (&EEPROM) sous... t97=&Recharger fichier t98=&Imprimer... t99=&Fermer t100=&Quitter //Menu Edit t101=Edition ¬e... t102=Edition &tampon activée //Menu Command t103=&Lire tout t104=Lecture programme (FLASH) t105=Lecture données (EEPROM) t106=Lecture bits de &sécurité et de configuration t107=E&crire tout t108=Ecrire programme (&FLASH) t109=Ecrire données (EEPROM) t110=Ecr&ire bits de sécurité et de configuration t111=&Vérifier tout t112=Vérifier programme (FLASH) t113=Vérifier données (EEPROM) t114=Vé&rifier bits de sécurité et de configuration t115=&Effacer t116=&Obtenir infos t117=Rese&t t118=&Programme t119=Programme Options... //Menu Options t120=Configuration &interface ... t121=&Calibrage t122=&Mode commande //Menu Utility t123=&Effacer tampon t124=&Remplir tampon... t125=&Double Bank t126=&Byte Swap t127=Définir &numéro de série t128=C&onfigurer numéro de série... //Menu Help t129=A&ide t130=&A propos //Menu Options t131=&Log Fichier... //Tool Bar //Dialog Messages t136=Type de composant //Tool tips t137=Ouvrir fichier composant t138=Sauvegarder fichier composant t139=Imprimer tampon t140=Recharger fichier t141=Lire composant t142=Lire mémoire programme (FLASH) t143=Lire mémoire données (EEPROM) t144=Lire bits de sécurité et de configuration t145=Ecrire composant t146=Ecrire mémoire composant (FLASH) t147=Ecrire mémoire données (EEPROM) t148=Vérifier mémoire programme (FLASH) t149=Vérifier mémoire données (EEPROM) t150=Vérifier bits de sécurité et de configuration t151=Sélection famille de composants t152=Sélection type de composant t153=Edition notes composant //Error Messages t154=Le composant ne répond pas t155=Mauvais composant, sélectionner le bon type t156=Composant introuvable ou inconnu t157=Impossible de tester, mauvais composant ou composant protégé t158=Abandon par l'utilisateur t159=Port de communication non disponible t160=Accès E/S impossible. Vous devez être root pour opérer sur les E/S t161=Programmateur introuvable t162=Erreur matériel, le programmateur est-il correctement branché ? t163=Bus occupé ou erreur matériel t164=Pas d'acquittement du composant t165=Pas de composant t166=Timeout sur le bus I2C t167=Erreur de condition Stop sur le bus I2C (mauvais timing?) t168=Erreur d'écriture t169=Erreur test de virginité t170=Erreur N° //----Setup dialog //Dialog title t172=Configuration port E/S t173=Configuration carte interface //Dialog messages t174=Interface COM/LPT t175=Série t176=Parallèle t177=Sélection interface t178=Type d'interface t179=Sélectionner port série t180=COM t183=Sélectionner port parallèle t184=LPT t185=Sélectionner la polarité des lignes de contrôle t186=Inversion Reset t187=Inversion SCKL t188=Inversion D-IN t189=Inversion D-OUT //Tool tips t190=Sélectionner port série COM t192=Sélectionner port parallèle LPT //----Fill dialog //Dialog title t193=Remplir tampon //Dialog messages: NB should be of the same size (number of char) t194=Depuis t195=Jusqu'à t196=Valeur //----Fuse dialog //Button captions t197=Effacer tout t198=Sélectionner tout t199=Ecriture t200=Lecture //Dialog title t201=Bits de configuration et de sécurité //Dialog messages: NB should be of the same size (number of char) t202=Premier bloc à verrouiller t203=Nbre de bloc à verrouiller t204=High endurance block //Tool tips t205=Tous les bits à '0' t206=Tous les bits à '1' t207=Ecrire bits dans le composant t208=Lire bits depuis le composant //----Info dialog //Button captions t209=Fermer //Dialog title t210=Info composant //Dialog messages t211=Bank roll-over capability: t212=Taille: t213=CRC: t214=Bloc de sécurité: t215=High endurance block: //----Char Edit dialog //Dialog title t216=Edition tampon //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Décimal t219=Caractère //Tool tips t222=Valeur hexadécimale t223=Valeur décimale t224=Valeur caractère //----Program Option dialog //Dialog title t225=Options de programmation //Dialog messages t226=Recharger fichiers t227=Lecture mémoire programme (FLASH) t228=Lecture mémoire données (EEPROM) t229=Lecture numéro de série t230=Swap octet t231=Mettre numéro de série t232=Effacement t233=Ecriture mémoire programme (FLASH) t234=Ecriture mémoire données (EEPROM) t235=Ecriture bits de configuration et de sécurité t236=Vérification bits de configuration et de sécurité //----Serial Number dialog //Dialog title t237=Configuration numéro de série //Dialog messages: NB should be of the same size (number of char) t238=Adresse t239=Taille t240=Valeur t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Décalage mémoire données //Tool tips t245=Adresse mémoire t246=Taille en octets t247=Prochaine valeur utilisée t248=En supposant l'adresse relative à la mémoire donnée au lieu de la mémoire programme t249=Octet le plus important à l'adresse haute t250=Octet le moins important à l'adresse basse //----Retry dialog //Button captions t251=Annuler t252=Recommencer t253=Ignorer //Dialog title t254=Alerte ! //----Notes dialog //Dialog title t255=Edition notes composant //----Progress dialog //Dialog title t256=Etat //Script t84=Scri&pt t132=&Editer... t133=&Charger et Executer... t134=&AutoChargement t135=E&xecuter t59=Erreur dans le script à la ligne t60=Commande erronée t61=Mauvais argument t62=Argument absent t63=Voulez vous continuer ? t79=Ouvrir le fichier script t171=Erreur dans le script t70=Ouvrir le fichier programme (FLASH) t71=Ouvrir le fichier données (EEPROM) t220=Insérer la nouvelle valeur t221=Entrer le texte à la position t258=Désactiver le son //---- Oscillator Calibration Byte t260=Octet de calibrage d'oscillateur t261=Lire l'octet de Calibr.d'Osc. t262=Options de Calibr.d'Osc... t263=Lecture de l'octet de Calibrage d'Osc. réussie t264=Identification Composant t265=Info t266=Taille EEPROM t267=Taille FLASH t268=Incrémentation automatique t269=Incrémenter le numéro de série après sa phase d'écriture t270=Saut de banc impossible sans modification et écriture. Voulez-vous écrire ? t271=Tampon modifié. Le sauvegarder avant la lecture ? t272=Ouvrir fichier programme (FLASH) t273=Ouvrir fichier (EEPROM) t274=Sauvegarder fichier programme (FLASH) t275=Sauvegarder fichier données (EEPROM) t276=Nouvelle fenêtre t277=Lancer le cycle de programmation t278=Exécuter le script t279=Ouvrir la boîte setup t280=Effacer le composant entier (FF) t281=Bits de Sécurité et Configuration t282=Bits de Sécurité et Configuration //These strings are added to the 'Configuration and security bits' dialog to explain t283=Reportez-vous à la feuille de caractéristiques du composant, svp t284=Les points cochés sont programmés t285=Les points non cochés ne sont pas programmés //2003/06/19 //Jean-Paul Brodier //Minor spelling corrections //Replaced"calibration", which is not a French word, with"calibrage", which is; accordingly corrected the gender of adjectives and participles //Added my name to the credits list tmp9balx013/lang/ukrainian.utf0000644000175000017500000002203613616566001016353 0ustar carstencarstenLANGUAGE_NAME ukrainian LANGUAGE_CHARSET UTF-8 t0=ukrainian t1=Translator Credits: t2= t3=Serial Device Programmer t4=Download last version of t5=at the address: t6=No Name //Button captions t7=OK t8=Cancel t9=Help t10=Probe t12=Note t13=Edit //Dialog messages t14=Version t15=Yes t16=No t17=Ok t18=Test t19=Failed t20=About t21=Page t22=Unknown t23=Buffer \"%s\"changed. Save it before to close? t24=Buffer changed. Save it before to open? t25=Nothing to save t26=Nothing to load t27=Nothing to print t28=Nothing to write t29=Nothing to verify t30=Bus timing calibration.\nBe sure there're no application running other than t31=\n(the CPU and hard disk have to be idle)\nThe calibration may take a couple of seconds.\nDo you want to run calibration now? t32=Calibration OK t33=Calibration failed t34=You need to run Calibration from the Options menu\nbefore any read/write operations t35=You need to run Setup from the Options menu\nbefore any read/write operations t36=Reading... t37=Read successful\nDevice Size: t38=Are you sure to write the device?\nAll previous content will be lost t39=Writing... t40=Verifing... t41=Write successful t42=Write failed t43=Erasing... t44=Erase successful //t40=Verifing... t45=Cannot verify, device missing or bad device t46=Verify Failed t47=Verify successful t48=Program successful t49=Program Failed t50=Device resetted t51=Writing security bits... t52=Security bits write failed t53=Reading security bits... t54=Configuration bits read failed t55=Reading configuration bits... t56=Configuration bits read failed t57=Writing configuration bits... t58=Configuration bits write failed t64=Buffer empty t65=Operation not supported t66=Insert parameters t67=Bad parameters t68=Accepting commands... t69=Open device content file t72=File not found t73=File save failed t74=Save Device Content File As t75=Save Program (FLASH) Content File As t76=Save Data (EEPROM) Content File As t77=Close last window: do you want to exit? t78=Buffer changed. Save it before to close? //Menu entries //Main Menu t80=&Файл t81=&Правка t82=П&рилад t83=&Команди t85=У&тиліти t86=У&становки t87=&Опції t88=&? //Menu File t89=&Нове вікно t90=&Відкрити файл приладу t91=Відкрити програмний (&FLASH) файл... t92=Відкрити файл даних (&EEPROM)... t93=&Зберегти файл t94=Зберегти файл приладу &як t95=Зберегти программный (&FLASH) файл як... t96=Зберегти файл данных (&EEPROM) як... t97=Пе&резавантажити файли t98=&Друк... t99=&Закрити t100=В&ихід //Menu Edit t101=Змінити &нотатки t102=Змінити &дозволеність буфера //Menu Command t103=&Читати все t104=Читати програму (&FLASH) t105=Читати данні (&EEPROM) t106=Читати &біти конфигурації та безпеки t107=&Записати все t108=Записати програму (&FLASH) t109=Записати данні (&EEPROM) t110=Записати &біти конфигурації та безпеки t111=&Перевірити все t112=Перевірити програму (&FLASH) t113=Перевірити данні (&EEPROM) t114=Перевірити &біти конфигурації та безпеки t115=О&чистити t116=&GetInfo t117=&Сброс t118=&Пограма t119=&Опції програми... //Menu Options t120=&Налагодження інтерфейса... t121=&Калібровка t122=&Віддаленний режим //Menu Utility t123=&Очистити буфер t124=&Заполнити буфер... t125=&Подвійний банк t126=&Перестановка байт t127=&Установити Серійний Номер t128=&Налагодження Серійного Номера... //Menu Help t129=&Справка t130=&О //Menu Options t131=&Лог файл... //Tool Bar //Dialog Messages t136=Dev.Type //Tool tips t137=Open Device File t138=Save Device File t139=Print Buffer t140=Reload Files t141=Read Device t142=Read Program Memory (FLASH) t143=Read Data Memory (EEPROM) t144=Read Security and Configuration Bits t145=Write Device t146=Write Program Memory (FLASH) t147=Write Data Memory (EEPROM) t148=Verify Program Memory (FLASH) t149=Verify Data Memory (EEPROM) t150=Verify Security and Configuration Bits t151=Select device family t152=Select device type t153=Edit device notes //Error Messages t154=Device Not Responding t155=Bad device, select the correct type t156=Device missing or unknown device t157=Unable to probe, bad device or device locked t158=User abort t159=Communication port not available t160=I/O access denied. You must be root to perform I/O t161=Programmer board not found t162=Hardware error, is the board properly connected? t163=Bus busy or hardware error t164=Missing Acknowledge from the device t165=Missing device t166=Timeout on the bus t167=I2CBus Stop condition error (bad timing?) t168=Write error t169=Blank check error t170=Error n. //----Setup dialog //Dialog title t172=Налагодження портів ввода/вивода t173=Налагодження интерфейсної плати //Dialog messages t174=COM/LPT інтерфейс t175=Послідовный t176=Паралельний t177=Вибір інтерфейса t178=Тип інтерфейса t179=Вибір COM порта t180=COM t183=Вибір LPT порта t184=LPT t185=Вибір полярности керуючих линій t186=Інвертувати Reset t187=Інвертувати SCKL t188=Інвертувати D-IN t189=Інвертувати D-OUT //Tool tips t190=Select serial port COM t192=Select parallel port LPT //----Fill dialog //Dialog title t193=Fill Buffer //Dialog messages: NB should be of the same size (number of char) t194=From t195=To t196=Value //----Fuse dialog //Button captions t197=Clear All t198=Set All t199=Write t200=Read //Dialog title t201=Configuration and Security bits //Dialog messages: NB should be of the same size (number of char) t202=First Block to Lock t203=N.of Blocks to Lock t204=High endurance block //Tool tips t205=All bits to '0' t206=All bits to '1' t207=Write bits to the device t208=Read bits from the device //----Info dialog //Button captions t209=Close //Dialog title t210=Device Info //Dialog messages t211=Bank roll-over capability: t212=Size: t213=CRC: t214=Security block: t215=High endurance block: //----Char Edit dialog //Dialog title t216=Edit Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Char //Tool tips t222=Hexadecimal value t223=Decimal value t224=Char value //----Program Option dialog //Dialog title t225=Program Options //Dialog messages t226=Reload Files t227=Read Program memory (FLASH) t228=Read Data memory (EEPROM) t229=Read Seriial Number t230=Byte Swap t231=Set Serial Number t232=Erase t233=Write Program memory (FLASH) t234=Write Data memory (EEPROM) t235=Write Security and Config bits t236=Verify Security and Config bits //----Serial Number dialog //Dialog title t237=Serial Number Config //Dialog messages: NB should be of the same size (number of char) t238=Address t239=Size t240=Value t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Data memory offset //Tool tips t245=Memory address t246=Size in bytes t247=Next value to be used t248=Assume the Address relative to Data memory instead of Program memory t249=Most significant Byte at high address t250=Most significant Byte at low address //----Retry dialog //Button captions t251=Abort t252=Retry t253=Ignore //Dialog title t254=Alert //----Notes dialog //Dialog title t255=Edit Device Notes //----Progress dialog //Dialog title t256=Status //Script t84=Scri&pt t132=&Edit... t133=&Load and Run... t134=&Auto Load t135=&Run t59=Script error at line t60=Bad command t61=Bad argument t62=Argument missing t63=Do you want to continue? t79=Open script file t171=Script error t70=Open program (FLASH) content file t71=Open data (EEPROM) content file t220=Insert the new value t221=Enter text from location t258=Disable sound //---- Oscillator Calibration Byte t260=Oscillator Calibration Byte t261=Read Osc.Calibration Byte t262=Osc. Calibration Options... t263=Read Osc.Calibration Byte successful t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/hungarian.utf0000644000175000017500000002312613616566001016347 0ustar carstencarstenLANGUAGE_NAME hungarian LANGUAGE_CHARSET UTF-8 t0=hungarian //Fill this with your reference, if it's empty""it will be invisible t1=Translator Credits: t2= t3=Soros Mikrokontroller Programozó t4=Legfrissebb verzió letöltése t5=ezen a címen: t6=Névtelen //Button captions t7=OK t8=Mégesem t9=Súgó t10=Próba t11=Hardware Ellenõrzés t12=Megjegyzés t13=Szerkesztés //Dialog messages t14=Verzió t15=Igen t16=Nem t17=Ok t18=Teszt t19=Hiba t20=Ezért t21=Oldal t22=Ismeretlen t23=Buffer \"%s\"megváltozott. Menti bezárás elõtt? t24=Buffer megváltozott. Menti megnyitás elõtt? t25=Semmit nem ment t26=Semmit nem tölt be t27=Semmit nem nyomtat t28=Semmit sem ír t29=Semmit sem ellenõriz t30=Busz idõzítés kalibráció.\nBiztos benne, hogy más alkalmazás nem használja t31=\n(a CPU-t és a HDD-t más alkalmazás egyidejûleg nem használhatja.)\nA Kalibráció több másodpercig is eltarthat. \nAkarja futtatni a Kalibrációt most? t32=Kalibráció OK t33=Kalibráció hibás t34=Akarja futtatni a Kalibrációt a Lehetõségek mennübõl\n az írás/olvasás végrehajtása elõtt t35=Akarja a Beállítást futtatni a Lehetõségek menübõl\naz írás/olvasás végrehajtása elõtt t36=Olvasás... t37=Olvasás megtörtént\nEszköz mérete: t38=Biztos benne, hogy írni akar az eszközbe?\nMinden elõzõ tartalom elveszik t39=Írás... t40=Ellenõrzés... t41=Írás megtörtént t42=Írás hibás t43=Törlés... t44=Törlés megtörtént t45=Nem lehet ellenõrizni. AZ eszköz hiányzik vagy hibás t46=Ellenõrzés hibás t47=Ellenõrzés megtörtént t48=Programozás megtörtént t49=Programozás hibás t50=Eszköz reset t51=Biztonsági bitek írása... t52=Biztonsági bitek írása közben hiba történt t53=Biztonsági bitek olvasása... t54=Biztonsági bitek olvasása közben hiba történt t55=Konfigurációs bitek olvasása t56=Konfigurációs bitek olvasása közben hiba történt t57=Konfigurációs bitek írása t58=Konfigurációs bitek írása közben hiba történt t59=Script hiba a sorban t60=Hibás parancs t61=Hibás argumentum t62=Argumentum hiányzik t63=Biztos benne, hogy folytatja? t64=Buffer üres t65=Ez az utasítás nem alkalmazható t66=Paraméterek beillesztése t67=Hibás paraméterek t68=Parancsok fogadása... t69=Eszköz tartalmának megnyitása t70=Program (FLASH) tartalmának megnyitása t71=Data (EEPROM) tartalmának megnyitása t72=Fájl nem található t73=Fájl mentése közben hiba történt t74=Eszköz tartalmának mentése másként t75=Program (FLASH) tartalmának mentése másként t76=Data (EEPROM) tartalmának mentése másként t77=Bezárta az utolsó ablakot is: Ki akar lépni? t78=Buffer tartalma megváltozott. Menti bezárás elõtt? t79=Script fájl megnyitása //Menu entries //Main Menu t80=Fájl t81=Szerkesztés t82=Eszköz t83=Parancs t84=Script t85=Utility t86=Beállítás t87=Lehetõségek t88=? //Menu File t89=Új Ablak t90=Eszköz fájl megnyitása... t91=Program (FLASH) Fájl megnyitása... t92=Data (EEPROM) Fájl megnyitása... t93=Eszköz fájl mentése t94=Eszköz fájl mentése másként... t95=Program (FLASH) Fájl mentése másként... t96=Data (EEPROM) Fájl mentése másként... t97=Fájl Újratöltése t98=Nyomtatás... t99=Bezárás t100=Kilép //Menu Edit t101=Szerkesztõ Megjegyzés... t102=Buffer szerkesztés engedélyezve //Menu Command t103=Mindent olvas t104=Program (FLASH) olvasás t105=Data (EEPROM) olvasás t106=Biztonsági és Konfigurációs bitek olvasása t107=Mindent ír t108=Program (FLASH) írás t109=Data (EEPROM) írás t110=Biztonsági és Konfigurációs bitek írása t111=Mindent ellenõriz t112=Program (FLASH) ellenõrzése t113=Data (EEPROM) ellenõrzése t114=Biztonsági és Konfigurációs bitek ellenõrzése t115=Törlés t116=Azonosítás t117=Reset t118=Program t119=Program Lehetõségek... //Menu Options t120=Csatoló beállítás... t121=Kalibráció t122=Távirányított mód //Menu Utility t123=Buffer törlése t124=Buffer feltöltése... t125=Double Bank t126=Byte csere t127=Szériaszám beállítás t128=Száriaszám konfigurálás... //Menu Help t129=Súgó t130=A programról //Menu Options t131=Log Fájl... //Menu Script t132=Szerkesztés... t133=Megnyitás és futtatás... t134=Automatikus megnyitás t135=Futtatás //Tool Bar //Dialog Messages t136=Eszköz tipus //Tool tips t137=Eszköz fájl megnyitás t138=Eszköz fájl mentés t139=Buffer nyomtatás t140=Fájlok újratöltése t141=Eszköz olvasás t142=Program Memória (FLASH) olvasás t143=Data Memória (EEPROM) olvasás t144=Biztonsági és Konfigurációs bitek olvasása t145=Eszköz írás t146=Program Memória (FLASH) írás t147=Data Memória (EEPROM) írás t148=Program Memória (FLASH) ellenõrzése t149=Data Memória (EEPROM) ellenõrzése t150=Biztonsági és Konfigurációs bitek ellenõrzése t151=Eszköz család választás t152=Eszköz tipus választás t153=Eszköz megjegyzések szerkesztése //Error Messages t154=Az eszköz nem válaszol t155=Hibás eszközválasztás, válassza ki a megfelelõ tipust t156=Eszköz hiányzik, ismeretlen vagy hibás t157=Vizsgálat nem engedélyezhetõ, az eszköz rossz vagy letiltott t158=Felhasználói megszakítás t159=Kommunikációs port nem nyitható meg t160=I/O hozzáférés megtiltva. Próbálkozzon I/O újrakonfigurálással. t161=Programozó kártya nem található t162=Hardware hiba! Ellenõrizze a kártya csatlakozását. t163=Busz foglalt vagy hardver hiba t164=Nem érkezik nyugta az eszköztõl t165=Eszköz hiányzik t166=Idõtúllépés a buszon t167=I2CBus Stop feltétel hiba (rossz idõzítés?) t168=Írás hiba t169=Hiba a (Blank) ellenõrzés során t170=Hiba szám t171=Script hiba //----Setup dialog //Dialog title t172=I/O port beállítás t173=Interfész kártya beállítás //Dialog messages t174=COM/LPT interfész t175=Soros t176=Párhuzamos t177=Interfész választás t178=Interfész tipus t179=Kommunikációs port választás t180=COM t183=Nyomtatóport választás t184=LPT t185=Vezérlõ vonalak polaritása t186=Invertált Reset t187=Invertált SCKL t188=Invertált D-IN t189=Invertált D-OUT //Tool tips t190=COM kommunikációs port t192=LPT kommunikációs port //----Fill dialog //Dialog title t193=Buffer feltöltés //Dialog messages: NB should be of the same size (number of char) t194=Tól t195=-ig t196=Érték //----Fuse dialog //Button captions t197=Mindet töröl t198=Mindet beállít t199=Írás t200=Olvasás //Dialog title t201=Biztonsági és Konfigurációs bitek //Dialog messages: NB should be of the same size (number of char) t202=Elsõ blokk t203=Blokkok száma t204=Magas tûrésû blokk //Tool tips t205=Minden bit '0' t206=Minden bit '1' t207=Bitek írása az eszközbe t208=Bitek olvasása az eszközbõl //----Info dialog //Button captions t209=Bezár //Dialog title t210=Eszköz Info //Dialog messages t211=Bank roll-over kapacitás: t212=Méret: t213=CRC: t214=Biztonsági blokk: t215=Magas tûrésû blokk: //----Char Edit dialog //Dialog title t216=Buffer szerkesztés //Dialog messages: NB should be of the same size (number of char) t217=Hexa t218=Decimális t219=Karakteres t220=Adja meg az új értéket t221=Írja be a szöveget a címtõl //Tool tips t222=Hexadecimális érték t223=Decimális érték t224=Karakteres érték //----Program Option dialog //Dialog title t225=Program Lehetõségek //Dialog messages t226=Fájlok újratöltése t227=Program memória (FLASH) olvasása t228=Data memória (EEPROM) olvasása t229=Szériaszám olvasása t230=Byte csere t231=Szériaszám beállítása t232=Törlés t233=Program memória (FLASH) írása t234=Data memória (EEPROM) írása t235=Biztonsági és Konfigurációs bitek írása t236=Biztonsági és Konfigurációs bitek ellenõrzése //----Serial Number dialog //Dialog title t237=Szériaszám konfigurálás //Dialog messages: NB should be of the same size (number of char) t238=Cím t239=Méret t240=Érték t241=Formátum //next 2 probably can't be translated t242=Növekvõ (Little Endian) t243=Csökkenõ (Big Endian) t244=Data memória offszet //Tool tips t245=Memória cím t246=Méret byte-okban t247=Következõ használt érték t248=Program memória helyett a Data memóriához tartozó címet mutatja t249=Legnagyobb byte az utolsó címen (Little Endian) t250=Legnagyobb byte az elsõ címen (Big Endian) //----Retry dialog //Button captions t251=Megszakítás t252=Újra t253=Kihagy //Dialog title t254=Figyelem! //----Notes dialog //Dialog title t255=Eszköz megjegyzések szerkesztése //----Progress dialog //Dialog title t256=Állapot //----Hardware check dialog t257=Hardware ellenõrzés //----About dialog t258=Hang kikapcsolása //---- Oscillator Calibration Byte t260=Oszcillátor beállító byte t261=Oszcillátor beállító byte olvasása t262=Oszcillátor beállítási lehetõségek... t263=Oszcillátor beállító byte olvasása successful t264=Chip azonosító t265=Megjegyzés t266=EEPROM Méret t267=FLASH Méret t268=Automatikus növelés t269=Növeli a szériaszámot minden 'Szériaszám beállítás' után t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/srpski.utf0000644000175000017500000002170313616566001015705 0ustar carstencarstenLANGUAGE_NAME srpski LANGUAGE_CHARSET UTF-8 t0=Srpski t1=Prevodilac: t2=Fox t3=Serijski eprom programator t4=Zadnju verziju nacicete t5=na adresi: t6=Bez Imena //Button captions t7=U radu t8=Odustani t9=Pomoc t10=Proba t12=Napomena t13=Unos //Dialog messages t14=Verzija t15=Da t16=Ne t17=U redu t18=Test t19=Greska t20=Info t21=Strana t22=Nepoznat t23=Buffer \"%s\"izmenjen. Snimiti ga pre zatvaranja? t24=Buffer izmenjen. Snimiti ga pre otvaranja? t25=Nista za snimanje t26=Nista za ucitavanje t27=Nista za stampanje t28=Nista za zapisivanje t29=Nista za verifikaciju t30=Kalibracija vremena sabirnice.\nBudi siguran da ne radi ni jedna druga aplikacija osim t31=\n(CPU i HDD na cekanju)\nKalibracija moze potrajati vise sekundi.\nDa li zelite da pokrenete ukalibraciju sada? t32=Kalibracija uspesna t33=Greska u kalibraciji t34=Vi morate uraditi kalibraciju iz menija 'Opcije'\npre bilo koje 'citaj/pisi' operacije t35=Vi morate uraditi 'Podesavanja' iz menija 'Opcije'\npre bilo koje 'citaj/pisi' operacije t36=Citam... t37=Citanje uspesno\nVelicina uredjaja: t38=Jeste li sigurni da zelite programirati uredjaj?\nSav stari sadrzaj bice izgubljen t39=Programiram... t40=Verifikujem... t41=Programiranje uspesno t42=Programiranje neuspesno t43=Brisem... t44=Brisanje uspesno //t40=Verifikacija... t45=Ne mogu verifikovati, uredjaj nedostaje ili nije ispravan t46=Greska u verifikaciji t47=Verifikacija uspesna t48=Programiranje uspesno t49=Programiranje neuspesno t50=Uredjaj resetovan t51=Pisem bitove za zastitu... t52=Greska upisa bitova za zastitu t53=Citam bitove za zastitu... t54=Greska citanja bitova za zastitu t55=Citam bitove za konfiguraciju... t56=Greska citanja bitova za konfiguraciju t57=Pisem bitove za konfiguraciju... t58=Greska upisa bitova za konfiguraciju t64=Buffer prazan t65=Operacija nije podrzana t66=Unesi parametre t67=Losi parametri t68=Primam komande... t69=Otvori datoteku sa sadrzajem uredjaja t72=Datoteka nije pronadjena t73=Greska pri snimanju datoteke t74=Snimi datoteku kao t75=Snimi sadrzaj Program (FLASH) Datoteka Kao t76=Snimi Sadrzaj Podataka (EEPROM) Datoteka Kao t77=Zatvori zadnji prozor: Zelite li izaci? t78=Buffer promenjen. Snimiti ga pre zatvaranja? //Menu entries //Main Menu t80=&Datoteka t81=U&redjivanje t82=&Uredjaj t83=&Komanda t85=&Pomocni t86=Po&desavanje t87=&Opcije t88=&? //Menu File t89=&Novi Prozor t90=&Otvori Datoteku Uredjaja... t91=Otvori &Programsku Datoteku (FLASH)... t92=Otvori Datoteku za P&odatke (EEPROM)... t93=&Snimi Datoteku Uredjaja t94=Spremi Datoteku Uredjaja &Kao... t95=Spremi Programsku datoteku (&FLASH) kao... t96=Spremi datoteku Podataka (&EEPROM) kao... t97=&Ponovo ucitaj datoteke Datoteka t98=Sta&mpanje... t99=&Zatvori t100=&Izlaz //Menu Edit t101=Izmeni &Napomenu... t102=&Omogucena Izmena Buffer-a //Menu Command t103=&Citaj Sve t104=Citaj Program (FLASH) t105=Citaj Podatke (EEPROM) t106=Citaj Bitove za Zastitu i Konfiguraciju t107=&Snimi SVE t108=Snimi Program (&FLASH) t109=Snimi Podatke (EEPROM) t110=&Snimi Bitove za zastitu i Konfiguraciju t111=&Provjeri Sve t112=Provjeri Program (FLASH) t113=Provjeri Podatke (EEPROM) t114=&Provjeri Bitove za zastitu i Konfiguraciju t115=&Obrisi t116=&Procitaj Info t117=Rese&t t118=&Programiraj t119=Programske Opcije... //Menu Options t120=Podesavanje &Izgleda Programa... t121=&Kalibracija t122=&Udaljeni Mod //Menu Utility t123=&Ocisti Buffer t124=&Napuni Buffer... t125=&Dupla Banka t126=&Zamjeni Bajtove t127=Unesi Serijski&Broj t128=K&onfiguracija Serijskog Broja ... //Menu Help t129=&Pomoc t130=&O programu //Menu Options t131=&Log Datoteka... //Tool Bar //Dialog Messages t136=Tip Uredjaja //Tool tips t137=Otvori Datoteku Uredjaja t138=Snimi Datoteku Uredjaja t139=Stampaj sadrzaj Buffer-a t140=Ponovo ucitavanje Datoteka t141=Citaj Uredjaj t142=Citaj Programsku Memoriju (FLASH) t143=Citaj Memoriju za podatke (EEPROM) t144=Citaj Sigurnosne i Konfiguracijske Biteve t145=Snimi Uredjaj t146=Snimi Programsku Memoriju (FLASH) t147=Snimi Data Memoriju (EEPROM) t148=Verifikuj Programsku Memoriju (FLASH) t149=Verifikuj Data Memoriju (EEPROM) t150=Verifikuj Bitove za Zastitu i Konfiguraciju t151=Izaberi porodicu uredjaja t152=Izaberi tip uredjaja t153=Napisi napomenu o uredjaju //Error Messages t154=Uredjaj ne odgovara t155=Los uredjaj, izaberi ispravan tip t156=Uredjaj nedostaje ili nepoznat uredjaj t157=Ne mogu se prikljuciti, los uredjaj ili uredjaj zakljucan t158=Korisnik zahtjeva prekid t159=Komunikacioni port nije raspoloziv t160=Pristup I/O nije dozvoljen. Vi morate imati ovlastenje za pristup I/O t161=Programator nije pronadjen t162=Hardverska greska, da li je ploca pravilno prikljucena? t163=Sabirnica zauzeta ili hardverska greska t164=Uredjaj ne odgovara 'Acknowledge' t165=Nedostaje Uredjaj t166=Timeout na sabirnici t167=I2C sabirnica Stop greska (los tajming?) t168=Greska pri pisanju t169=Uredjaj nije prazan t170=Greska br. //----Setup dialog //Dialog title t172=Podesavanje I/O porta t173=Podesavanje Interfejs ploce //Dialog messages t174=COM/LPT interfejs t175=Serijski t176=Paralelni t177=Odaberi Interfejs t178=Vrsta Interfejsa t179=Izaberi COM port t180=COM t183=Izaberi LPT port t184=LPT t185=Izaberi Polaritet Kontrolnih linija t186=Invertovan Reset t187=Invertovan SCKL t188=Invertovan D-IN t189=Invertovan D-OUT //Tool tips t190=Izaberi serijski port COM t192=Izaberi paralelni port LPT //----Fill dialog //Dialog title t193=Napuni Buffer //Dialog messages: NB should be of the same size (number of char) t194=Iz t195=Na t196=Vrednos //----Fuse dialog //Button captions t197=Obrisi sve t198=Setuj sve t199=Upisi t200=Citaj //Dialog title t201=Bitove za Zastitu i Konfiguraciju //Dialog messages: NB should be of the same size (number of char) t202=Prvi Blok za zakljuc t203=Br. Blokova za zaklj t204=Blok visokog opterec //Tool tips t205=Svi bitovi na '0' t206=Svi bitovi na '1' t207=Upisi bit u uredjaj t208=Citaj bit iz uredjaja //----Info dialog //Button captions t209=Zatvori //Dialog title t210=Uredjaj Info //Dialog messages t211=Mogucnost roll-over banke: t212=Velicina: t213=CRC: t214=Sigurnosni blok: t215=Blok visokog opterecenja: //----Char Edit dialog //Dialog title t216=Editovanje Buffer-a //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Karakter //Tool tips t222=Hexadecimalna vrednost t223=Decimalna vrednost t224=Karakt. vrednost //----Program Option dialog //Dialog title t225=Programske Opcije //Dialog messages t226=Ponovo Ucitaj Datoteku t227=Citaj Programsku memoriju (FLASH) t228=Citaj Data memoriju (EEPROM) t229=Citaj Serijski Broj t230=Zameni Bajtove t231=Unesi Serijski Broj t232=Obrisi t233=Zapisi Programsku memoriju (FLASH) t234=Zapisi memoriju podataka (EEPROM) t235=Zapisi Bitove za Zastitu i Konfiguraciju t236=Verifikuj Bitove za Zastitu i Konfiguraciju //----Serial Number dialog //Dialog title t237=Konfiguracija Serijskog Broja //Dialog messages: NB should be of the same size (number of char) t238=Adresa t239=Velicina t240=Vrednost t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Offset memorije podataka //Tool tips t245=Adresa Memorije t246=Velicina u bajtovima t247=Sledeca vrednost koja ce se koristiti t248=Podrazumeva Adresu relativnu na memoriju podataka umjesto Programske memorije t249=Najznacajniji bajt na visokoj adresi t250=Najznacajniji bajt na nizoj adresi //----Retry dialog //Button captions t251=Prekid t252=Ponovo t253=Ignorisi //Dialog title t254=Paznja //----Notes dialog //Dialog title t255=Uredi podatke o Uredjaju //----Progress dialog //Dialog title t256=Status //Script t84=Skri&pt t132=&Popravi... t133=&Ucitaj i startuj... t134=&Automatski ucitaj t135=&Startuj t59=Greska u skriptu na liniji t60=Losa komanda t61=Los argument t62=Argument nedostaje t63=Zelite li nastaviti? t79=Otvori skript datoteku t171=Greska u skriptu t70=Otvori programsku datoteku (FLASH) t71=Otvori datoteku za podatke (EEPROM) t220=Unesi novu vrijednost t221=Unesi text sa lokacije t258=Ugasi Zvuk //---- Oscillator Calibration Byte t260=Bajt za kalibraciju oscilatora t261=Procitaj Bajt za kalibraciju oscilatora t262=Opcije za kalibraciju oscilatora... t263=Citanje bajta za kalibraciju oscilatora uspesno t264=Cip Id t265=Napomena t266=Velicina EEPROM-a t267=Velicina FLASH-a t268=Automatsko povecavanje t269=Povecaj serijski broj posle svake 'postavi serijski broj' operacije t270=Nemogu da saznam roll-over bez modifikacije i upisa, da li zelite da upisem? t271=Bafer promenjen. Snimiti pre citanja? t272=Otvori fajl Programske Memorije (FLASH) t273=Otvori fajl Memorije Podataka (EEPROM) t274=Snimi fajl Programske Memorije (FLASH) t275=Snimi fajl Memorije Podataka (EEPROM) t276=Novi Prozor t277=Startuj programski ciklus t278=Izvrsi skript t279=Otvori setap dijalog t280=Obrisi ceo uredjaj sa FF t281=Sigurnosni i Konfiguracioni &Bitovi... t282=Sigurnosni i Konfiguraconi Bitovi //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/russian.utf0000644000175000017500000003402413616566001016056 0ustar carstencarstenLANGUAGE_NAME russian LANGUAGE_CHARSET UTF-8 t0=русский t1=Автор перевода: t2=Schematic Terrorist. E-mail: sterr@fromru.com t3=Программатор устройств с последовательным доступом t4=Скачайте последнюю версию t5=по адресу: t6=default //Button captions t7=OK t8=Отмена t9=Помощь t10=Проверка t12=Комментарий t13=Редактировать //Dialog messages t14=Версия t15=Да t16=Нет t17=Ok t18=Тест t19=Ошибка t20=О программе t21=Страница t22=Неизвестно t23=Буфер \"%s\"изменен. Сохранить перед закрытием? t24=Буфер изменен. Записать перед открытием? t25=Нечего записывать t26=Нечего загружать t27=Нечего печатать t28=Нечего записывать t29=Нечего проверять t30=Настройка временных характеристик шины.\nВыгрузите все ненужные приложения t31=\n(процессор и винчестер не должны быть заняты другими приложениями)\nКалибровка может занять несколько секунд.\nЗапустить калибровку? t32=Калибровка завершена t33=Ошибка калибровки t34=Вы должны запустить Калибровку из меню Настройки\nперед чтением/записью t35=Вы должны запустить Настройку оборудования из меню Настройки\nперед чтением/записью t36=Считывание... t37=Считывание завершено\nРазмер памяти: t38=Вы точно хотите произвести запись?\nВсе предыдущее содержимое будет потеряно t39=Запись... t40=Проверка... t41=Запись завершена t42=Ошибка записи t43=Стирание... t44=Стирание завершено //t40=Проверка... t45=Проверка невозможна, устройство неисправно или не подключено t46=Ошибка при проверке t47=Проверка завершена t48=Программирование завершено t49=Ошибка при программировании t50=Устройство инициализировано t51=Запись битов защиты... t52=Ошибка записи битов защиты t53=Чтение битов защиты... t54=Ошибка чтения битов защиты t55=Чтение битов конфигурации... t56=Ошибка чтения битов конфигурации t57=Запись битов конфигурации... t58=Ошибка записи битов конфигурации t64=Буфер пуст t65=Операция не поддерживается t66=Вставьте параметры t67=Неправильные параметры t68=Прием команд... t69=Открыть файл содержимого устройства t72=Файл не найден t73=Ошибка сохранения файла t74=Сохранить содержимое устройства как t75=Сохранить память программ (FLASH) как t76=Сохранить память данных (EEPROM) как t77=Закрыто последнее окно: хотите выйти? t78=Буфер изменен. Записать перед закрытием? //Menu entries //Main Menu t80=&Файл t81=&Правка t82=&Устройство t83=&Команды t85=&Утилиты t86=У&становки t87=&Настройки t88=&? //Menu File t89=&Новое окно t90=&Открыть файл с данными... t91=Открыть файл программы (FLASH)... t92=Открыть файл данных (EEPROM)... t93=&Сохранить файл с данными t94=Сохранить файл с данными к&ак... t95=Сохранить файл программы (&FLASH) как... t96=Сохранить файл данных (&EEPROM) как... t97=Открыть заново t98=Печать... t99=Закрыть t100=В&ыход //Menu Edit t101=Правка комментария... t102=Редактирование буфера //Menu Command t103=Считать все t104=Считать программу (FLASH) t105=Считать данные (EEPROM) t106=Считать биты защиты и конфигурации t107=Записать все t108=Записать программу (&FLASH) t109=Записать данные (EEPROM) t110=Записать биты защиты и конфигурации t111=Проверить все t112=Проверить программу (FLASH) t113=Проверить данные (EEPROM) t114=Проверить биты защиты и конфигурации t115=Стереть t116=&Информация t117=Аппаратный сброс t118=Программирование t119=Настройки программирования... //Menu Options t120=Настройка оборудования... t121=&Калибровка t122=&Дистанционный режим //Menu Utility t123=&Очистить буфер t124=&Заполнить буфер... t125=Удвоить t126=Переставить байты t127=Установить серийный номер t128=Установки серийного номера... //Menu Help t129=&Помощь t130=&О программе //Menu Options t131=&Файл отчета... //Tool Bar //Dialog Messages t136=Тип устройства //Tool tips t137=Открыть файл с данными t138=Сохранить файл с данными t139=Печать буфера t140=Открыть заново t141=Считать устройство t142=Считать память программ (FLASH) t143=Считать память данных (EEPROM) t144=Считать биты защиты и конфигурации t145=Записать устройство t146=Записать память программ (FLASH) t147=Записать память данных (EEPROM) t148=Проверить память программ (FLASH) t149=проверить память данных (EEPROM) t150=Проверить биты защиты и конфигурации t151=Выберите семейство устройств t152=Выберите тип устройства t153=Редактирование комментария //Error Messages t154=Устройство не отвечает t155=Неправильно задан тип устройства t156=Устройство отсутствует или неисправно t157=Проверка невозможна, устройство неисправно или заблокировано t158=Прервано пользователем t159=Порт недоступен или отсутствует t160=Отказано в доступе. Запустите программу с правами администратора t161=Плата программатора не обнаружена t162=Аппаратная ошибка. Плата программатора правильно подключена? t163=Шина занята. Аппаратная ошибка t164=Отсутствует сигнал Готовность (RDY) t165=Устройство отсутствует t166=Время ожидания истекло t167=Ошибка состояния Stop (неправильные временные характеристики?) t168=Ошибка записи t169=Проверка на чистоту. Ошибка. t170=Ошибка n. //----Setup dialog //Dialog title t172=Установки порта t173=Настройка платы программатора //Dialog messages t174=Порты COM/LPT t175=Последовательный t176=Параллельный t177=Выбор интерфейса t178=Тип интерфейса t179=Выбор COM-порта t180=COM t183=Выбор LPT-порта t184=LPT t185=Выбор полярности сигналов управления t186=Инвертировать Reset t187=Инвертировать SCKL t188=Инвертировать D-IN t189=Инвертировать D-OUT //Tool tips t190=Последовательный порт COM t192=Параллельный порт LPT //----Fill dialog //Dialog title t193=Заполнить буфер //Dialog messages: NB should be of the same size (number of char) t194=С t195=По t196=Числом //----Fuse dialog //Button captions t197=Очистить все t198=Установить все t199=Записать t200=Считать //Dialog title t201=Биты конфигурации и защиты //Dialog messages: NB should be of the same size (number of char) t202=Первый блок для блокировки t203=Количество блоков t204=Блок многократной записи //Tool tips t205=Все биты в '0' t206=Все биты в '1' t207=Запись битов в устройство t208=Чтение битов из устройства //----Info dialog //Button captions t209=Закрыть //Dialog title t210=Информация об устройстве //Dialog messages t211=Тип переключения банков: t212=Размер: t213=Контрольная сумма: t214=Блок защиты от записи: t215=Блок многократной записи: //----Char Edit dialog //Dialog title t216=Редактировать буфер //Dialog messages: NB should be of the same size (number of char) t217=Шестн. t218=Десят. t219=Символ //Tool tips t222=Шестнадцатеричное число t223=Десятичное число t224=Символ //----Program Option dialog //Dialog title t225=Настройки программирования //Dialog messages t226=Открыть заново файлы t227=Считать память программ (FLASH) t228=Считать память данных (EEPROM) t229=Считать серийный номер t230=Поменять байты местами t231=Установить серийный номер t232=Стереть t233=Записать память программ (FLASH) t234=Записать память данных (EEPROM) t235=Записать биты защиты и конфигурации t236=Проверить биты защиты и конфигурации //----Serial Number dialog //Dialog title t237=Настройка серийного номера //Dialog messages: NB should be of the same size (number of char) t238=Адрес t239=Размер t240=Число t241=Формат //next 2 probably can't be translated t242=Обратно t243=Прямо t244=Относительно памяти данных //Tool tips t245=Адрес в памяти t246=Размер в байтах t247=Следующее используемое значение t248=Адрес относительно памяти данных вместо памяти программ t249=Более значимый байт по старшему адресе t250=Более значимый байт по младшему адресе //----Retry dialog //Button captions t251=Прервать t252=Повторить t253=Игнорировать //Dialog title t254=Внимание! //----Notes dialog //Dialog title t255=Редактировать комментарий //----Progress dialog //Dialog title t256=Процесс //Script t84=Скрипт t132=&Редактировать... t133=&Загрузить и выполнить... t134=&Автозагрузка t135=&Выполнить t59=Ошибка в строке t60=Недопустимая команда t61=Неправильный аргумент t62=Аргумент отсутствует t63=Продолжить? t79=Открыть файл скрипта t171=Ошибка в скрипте t70=Открыть файл программы (FLASH) t71=Открыть файл данных (EEPROM) t220=Вставьте новое число t221=Вставьте текст с адреса t258=Выключить звук //---- Oscillator Calibration Byte t260=Калибровочный байт генератора t261=Считать калибровочный байт ген. t262=Настройка калибровки генератора... t263=Чтение калибров.байт ген. завершено t264=Тип микросхемы t265=Примечание t266=Размер EEPROM t267=Размер FLASH t268=Автоувеличение t269=Увеличивает серийный номер после каждой операции 'Установить серийный номер' t270=Нельзя определить тип переключения банков без изменения и записи, хотите записать? t271=Буфер изменен. Сохранить перед чтением? t272=Открыть файл памяти программы (FLASH) t273=Открыть файл памяти данных (EEPROM) t274=Сохранить файл памяти программы (FLASH) t275=Сохранить файл памяти данных(EEPROM) t276=Новое окно t277=Запустить программирование циклически t278=Выполнить скрипт t279=Настройка оборудования t280=Очистить всю память в FF t281=&Биты защиты и конфигурации... t282=Биты защиты и конфигурации //These strings are added to the 'Configuration and security bits' dialog to explain t283=Смотрите в документации на микросхему t284=Отмеченые биты запрограммированы t285=Не отмеченые не запрограммированы tmp9balx013/lang/bulgarian.utf0000644000175000017500000003364213616566001016343 0ustar carstencarstenLANGUAGE_NAME bulgarian LANGUAGE_CHARSET UTF-8 t0=bulgarian t1=Превод на български: t2=сп.'Млад Конструктор' - Д.Чанев t3=Сериен програматор t4=Можете да изтеглите последната версия на t5=от адрес: t6=Без име //Button captions t7=Да t8=Отказ t9=Помощ t10=Проба t12=Забележка t13=Редактиране //Dialog messages t14=Версия t15=Да t16=Не t17=Добре t18=Тест t19=Неуспешен t20=За t21=Страница t22=Неизвестен t23=Буферът \"%s\"е променен. Да бъде ли запазен преди затварянето? t24=Буферът е променен. Да бъде ли запазен преди отварянето? t25=Няма нищо за запазване t26=Няма нищо за зареждане t27=Няма нищо за печатане t28=Няма нищо за за записване t29=Няма нищо за проверка t30=Калибрация спрямо бързината на шината.\nУверете се, че няма други стартирани приложения различни от t31=\n(Процесора и хард-дисковете трябва да бъдат ненатоварени)\nКалибрацията може да отнеме няколко секунди.\nИскате ли да пристъпите към калибрация още сега? t32=Калибрацията е успешна t33=Калибрацията е неуспешна t34=Стартирайте 'Калибрация' от меню 'Настройка'\nпреди каквато и да е операция за четене/запис t35=Стартирайте 'Настройка на интерфейса' от меню 'Настройка'\nпреди каквато и да е операция за четене/запис t36=Четене... t37=Успешно четене\nРазмер на чипа: t38=Сигурни ли сте, че искате да запишете у-вото?\nПредходното съдържание ще бъде загубено! t39=Запис... t40=Проверка... t41=Записа е успешен t42=Записа е неуспешен t43=Изтриване... t44=Изтриването е успешно //t40=Проверка... t45=Проверката е невъзможна. Устройството липсва или е повредено. t46=Проверката е неуспешна t47=Проверката е успешна t48=Програмирането е успешно t49=Програмирането е неуспешно t50=Устройството е рестартирано t51=Запис на битовете за сигурност ... t52=Записa на битовете за сигурност е неуспешен t53=Четене на битовете за сигурност ... t54=Четенето на конфигурационните битове е неуспешно t55=Четене на конфигурационните битове ... t56=Четенето на конфигурационните битове е неуспешно t57=Запис на конфигурационните битове ... t58=Запис на конфигурационните битове неуспешен ... t64=Буферът е празен t65=Операцията не се поддържа t66=Въведете параметри t67=Некоректни параметри t68=Възприемане на командите ... t69=Отваряне на файл t72=Файлът не е намерен t73=Записа на файла е неуспешен t74=Запис на съдържанието на устройството като... t75=Запис на програмната (FLASH) памет като... t76=Запис на данновата (EEPROM) памет като ... t77=Затваряне на последния прозорец: Изход от програмата? t78=Буферът е променен. Да бъде ли записан преди затварянето? //Menu entries //Main Menu t80=&Файл t81=&Редактиране t82=&Устройство t83=&Команди t85=&Други t86=&Настройка t87=&Опции t88=&Помощ //Menu File t89=&Нов прозорец t90=&Отваряне на файл t91=Отваряне на програмен файл (FLASH) t92=Отваряне на даннов файл (EEPROM) t93=&Запис на файл t94=З&апис на файл като... t95=Запис на програмен файл (FLASH) като... t96=Запис на даннов файл (EEPROM) като... t97=Пре&зареждане на файловете t98=&Печат t99=За&тваряне на прозорец t100=Из&ход //Menu Edit t101=&Редакция на забележка t102=Ра&зрешено редактиране на буфера //Menu Command t103=&Четене на всичко t104=Четене на програма (FLASH) t105=Четене на данни (EEPROM) t106=Четене на &битове за сигурност и конф-ия t107=&Запис на всичко t108=Запис на програма(FLASH) t109=Запис на данни (EEPROM) t110=Запис на би&тове за сигурност и конф-ия t111=&Проверка на всичко t112=Проверка на програмата (FLASH) t113=Проверка на данните (EEPROM) t114=Проверка на битовете за сигурност и конф-ия t115=&Изтриване t116=Ин&формация t117=Ре&сет t118=Програ&миране t119=Опции за програмиране //Menu Options t120=&Настройка на интерфейса t121=&Калибрация t122=&Дистанционнен режим //Menu Utility t123=&Изчистване на буфера t124=&Запълване на буфера t125=Удвояване на банка t126=&Размяна на байтове t127=&Установява серийния номер t128=&Конфигурация на серийния номер //Menu Help t129=&Помощ t130=&За програмата //Menu Options t131=Log &файл //Tool Bar //Dialog Messages t136=Тип у-во //Tool tips t137=Отваряне на файл за у-во t138=Запис на файл за у-во t139=Печат на буфера t140=Презареждане на файловете t141=Четене на у-во t142=Четене напрограмната памет (FLASH) t143=Четене наданновата памет (EEPROM) t144=Четене битивете за сигурност и конф-ция t145=Запис на у-во t146=Запис на програмната памет (FLASH) t147=Запис на данновата памет (EEPROM) t148=Проверка на програмната памет (FLASH) t149=Проверка на данновата памет (EEPROM) t150=Проверка на битивете за сигурност и конф-ция t151=Избор на фамилия t152=Избор на тип у-во t153=Редактиране на забел. за у-во //Error Messages t154=Устройството не отговаря t155=Различно у-во, изберете подходящ тип у-во t156=Липсва у-во или непознато у-во t157=Неуспешна проба, различно у-во или у-вото е заключено t158=Потребителско прекъсване t159=Комуникационният порт не е свободен t160=Вх./изх. достъп е забранен. Рестартирайте за да го разрешите t161=Програматора не е разпознат t162=Хардуерна грешка! Проверете дали програматора е правилно свързан! t163=Шината е заета или хардуерна грешка t164=Липсва потвърждение (Ack) от у-вото t165=Липсващо у-во t166=Таймаут на шината t167=Грешка при стоп условие на I2C шина (лоши времеви параметри?) t168=Грешка при запис t169=Грешка при проверка за чисто у-во t170=Грешка N. //----Setup dialog //Dialog title t172=Настройка на вх./изх. порт t173=Настройка на интерфейсната платка //Dialog messages t174=COM/LPT интерфейс t175=Сериен t176=Паралелен t177=Избор на интерфес t178=Тип интерфейс t179=Избор на COM-порт t180=COM t183=Избор на COM-порт t184=LPT t185=Поляритет на контролните линии t186=Инверт. RESET t187=Инверт. SCKL t188=Инверт. D-IN t189=Инверт. D-OUT //Tool tips t190=Избор на сериен порт COM t192=Избор на паралелен порт LPT //----Fill dialog //Dialog title t193=Запълване на буфера //Dialog messages: NB should be of the same size (number of char) t194=От t195=До t196=Ст-ст //----Fuse dialog //Button captions t197=Изчисти всичко t198=Установи всичко t199=Запис t200=Четене //Dialog title t201=Битове за конфигурация и сигурност //Dialog messages: NB should be of the same size (number of char) t202=Първи блок за закл. t203=N. блокове за закл. t204=Високоустойчив блок //Tool tips t205=Всички битове в '0' t206=Всички битиве в '1' t207=Запис на битовете в у-вото t208=Четене на битовете от у-вото //----Info dialog //Button captions t209=Затвори //Dialog title t210=Информация за у-во //Dialog messages t211='Roll-over' съвмест.: t212=Размер: t213=Контролна сума: t214=Защитен блок: t215=Високоустойчив блок: //----Char Edit dialog //Dialog title t216=Редакция на буфера //Dialog messages: NB should be of the same size (number of char) t217=16-ично t218=10-ично t219=Символ //Tool tips t222=Шестнадесет. ст. t223=Десетична ст. t224=Ст. на символ //----Program Option dialog //Dialog title t225=Опции при програмиране //Dialog messages t226=Презареждане на файловете t227=Четене на програмната памет (FLASH) t228=Четене на данновата памет (EEPROM) t229=Четене на сериен номер t230=Размяна на байтове t231=Установяване на сериен номер t232=Изтриване t233=Запис на програмната памет (FLASH) t234=Запис на данновата памет (EEPROM) t235=Запис на битове за сигурност и конф. t236=Проверка на битове за сигурност и конф. //----Serial Number dialog //Dialog title t237=Сериен номер //Dialog messages: NB should be of the same size (number of char) t238=Адрес t239=Размер t240=Стойност t241=Формат //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Отместване в данновата памет //Tool tips t245=Адрес от паметта t246=Размер в байтове t247=Следваща стойност t248=Адрес за данновата памет вместо за програмната памет t249=Ст. байт на ст. адрес t250=Ст. байт на мл. адрес //----Retry dialog //Button captions t251=Прекъсни t252=Повтори t253=Игнорирай //Dialog title t254=Внимание //----Notes dialog //Dialog title t255=Редактиране на забел. за устр. //----Progress dialog //Dialog title t256=Състояние //Script t84=&Скрипт t132=&Редактиране... t133=&Зареждане и стартиране... t134=&Автоматично зареждане t135=&Стартиране t59=Грешка в скрипта на ред t60=Грешна команда t61=Невалиден аргумент t62=Липсва аргумент t63=Искате ли да продължите? t79=Отваряне на скрипт файл t171=Грешка в скрипта t70=Отваряне на програмен файл (FLASH) t71=Отваряне на даннов файл (EEPROM) t220=Въведете нова стойност t221=Въведете текст от позиция t258=Забрана на звука //---- Oscillator Calibration Byte t260=Байт за калибрация на осцилатора t261=Четене на байта за калиб. на осцилатора t262=Опции за калибрация на осцилатора... t263=Четенето на калибрациония байт е успещно t264=Чип Id t265=Забел. t266=EEPROM размер t267=FLASH размер t268=Автоматично увеличаване t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/chinese.utf0000644000175000017500000001761313616566001016015 0ustar carstencarstenLANGUAGE_NAME chinese LANGUAGE_CHARSET UTF-8 t0=Chinese(simplified) //Fill this with your reference, if it's empty""it will be invisible t1=简体中文汉化: t2=中国科学技术大学 荣新华\nE-mail: bd6cr@qsl.net\nhttp://www.qsl.net/bd6cr/hampic\n汉化更新:杨永胜 t3=串行器件编程器 t4=最新版本的 t5=下载地址: t6=未命名 //Button captions t7=确认 t8=取消 t9=帮助 t10=测试 t11=硬件检查 t12=注解 t13=编辑 //Dialog messages t14=版本 t15=是 t16=否 t17=OK t18=测试 t19=失败 t20=关于 t21=页 t22=未知 t23=缓冲 \"%s\"已更改。在关闭之前保存? t24=缓冲已更加。在关闭之前保存? t25=无可保存 t26=无可装载 t27=无可打印 t28=无可写入 t29=无可验证 t30=总线时序(bus timing)校准。\n请确认无别的程序运行,只运行 t31=\n(CPU和硬盘必须空闲)\n此校准过程可能需要几秒钟。\n现在运行校准吗? t32=校准完成 t33=校准失败 t34=在任何读/写操作以前,\n您应从选项菜单中运行校准。 t35=在任何读/写操作以前,\n您应从选项菜单中运行设置。 t36=读出... t37=读出成功\n器件容量: t38=您确认对器件写入吗?\n所有以前的内容都将丢失 t39=写入... t40=验证... t41=写入成功 t42=写入失败 t43=擦除... t44=擦除成功 t45=无法验证,器件不存在或不正确 t46=验证失败 t47=验证成功 t48=编程成功 t49=编程失败 t50=器件复位 t51=写入保密位... t52=写入保密位失败 t53=读出保密位... t54=读出保密位失败 t55=读出配置位... t56=读出配置位失败 t57=写入配置位... t58=写入配置位失败 t59=脚本错误,行号: t60=错误的命令 t61=错误的参数 t62=缺少参数 t63=继续吗? t64=缓冲为空 t65=操作不支持 t66=插入参数 t67=错误的参数 t68=正在接受命令... t69=打开器件内容文件 t70=打开程序(FLASH)内容文件 t71=打开数据(EEPROM)内容文件 t72=文件没有找到 t73=保存文件失败! t74=另存器件内容文件为 t75=另存程序(FLASH)内容文件为 t76=另存数据(EEPROM)内容文件为 t77=关闭最后一个窗口:您想退出吗? t78=缓冲区已更改。在关闭之前保存? t79=打开脚本文件 //Menu entries //Main Menu t80=文件&F t81=编辑&E t82=器件&D t83=命令&C t84=脚本&p t85=工具&U t86=设置&S t87=选项&O t88=&? //Menu File t89=新建窗口&N t90=打开器件文件&O... t91=打开程序(FLASH)文件&P... t92=打开数据(EEPROM)文件&D... t93=保存器件文件&S t94=另存器件文件为&A... t95=另存程序(&FLASH)文件为... t96=另存数据(&EEPROM)文件为... t97=重新加载文件&L t98=打印&T... t99=关闭&C t100=退出&x //Menu Edit t101=编辑注解&N... t102=允许编辑缓冲&F //Menu Command t103=读出所有&R t104=读出程序(FLASH) t105=读出数据(EEPROM) t106=读出保密位与配置位&B t107=写入所有&W t108=写入程序(&FLASH) t109=写入数据(EEPROM) t110=写入保密位与配置位&S t111=验证所有&V t112=验证程序(FLASH) t113=验证数据(EEPROM) t114=验证保密位与配置位&Y t115=擦除&E t116=获取信息&G t117=复位&T t118=编程&P t119=编程选项... //Menu Options t120=接口设置&I... t121=校准&C t122=远程模式&R //Menu Utility t123=清除缓冲&C t124=填充缓冲&F... t125=倍增容量 t126=字节互换&B t127=设置序列号&N t128=序列号配置&O... //Menu Help t129=帮助&H t130=关于&A //Menu Options t131=日志文件&L... //Menu Script t132=编辑&E... t133=加载并运行&L... t134=自动加载&A t135=运行&I //Tool Bar //Dialog Messages t136=类型 //Tool tips t137=打开器件文件 t138=保存器件文件 t139=打印缓冲 t140=重新加载文件 t141=读器件 t142=读程序存储器(FLASH) t143=读数据存储器(EEPROM) t144=读保密位与配置位 t145=写器件 t146=写程序存储器(FLASH) t147=写数据存储器(EEPROM) t148=验证程序存储器(FLASH) t149=验证数据存储器(EEPROM) t150=验证保密位与配置位 t151=选择器件家族 t152=选择器件类型 t153=编辑器件注解 //Error Messages t154=器件没有响应 t155=器件不正确,选择正确的类型 t156=没有器件或未知器件 t157=无法测试,器件不正确或器件被锁 t158=用户放弃 t159=通信端口不可用 t160=I/O访问拒绝。只有root才能进行I/O操作 t161=没有找到编程器板 t162=硬件错误,板子是否正确连接? t163=总线忙或硬件错误 t164=器件没有给出确认 t165=没有器件 t166=总线上超时 t167=I2C总线停止条件错误(时序不对?) t168=写入出错 t169=验空出错 t170=错误 n. t171=脚本错误 //----Setup dialog //Dialog title t172=I/O端口设置 t173=接口板设置 //Dialog messages t174=COM/LPT接口 t175=串行 t176=并行 t177=接口选择 t178=接口类型 t179=COM端口选择 t180=COM t183=LPT端口选择 t184=LPT t185=选择控制线的极性 t186=取反Reset t187=取反SCKL t188=取反D-IN t189=取反D-OUT //Tool tips t190=选择串口COM t192=选择并口LPT //----Fill dialog //Dialog title t193=填充缓冲 //Dialog messages: NB should be of the same size (number of char) t194=从 t195=到 t196=值 //----Fuse dialog //Button captions t197=清除所有 t198=设置所有 t199=写入 t200=读出 //Dialog title t201=配置位与保密位 //Dialog messages: NB should be of the same size (number of char) t202=锁定的第一块 t203=锁定的第N.块 t204=高耐用块 //Tool tips t205=所有位设置为'0' t206=所有位设置为'1' t207=写入位到器件 t208=从器件读出位 //----Info dialog //Button captions t209=关闭 //Dialog title t210=器件信息 //Dialog messages t211=Bank循环能力: t212=容量: t213=CRC: t214=保密块: t215=高耐用块: //----Char Edit dialog //Dialog title t216=编辑缓冲 //Dialog messages: NB should be of the same size (number of char) t217=十六进制 t218=十进制 t219=字符 t220=插入新值 t221=输入文本,从地址 //Tool tips t222=十六进制值 t223=十进制值 t224=字符值 //----Program Option dialog //Dialog title t225=编程选项 //Dialog messages t226=重新加载文件 t227=读程序存储器(FLASH) t228=读数据存储器(EEPROM) t229=读序列号 t230=字节互换 t231=设置序列号 t232=擦除 t233=写程序存储器(FLASH) t234=写数据存储器(EEPROM) t235=写保密位与配置位 t236=验证保密位与配置位 //----Serial Number dialog //Dialog title t237=序列号配置 //Dialog messages: NB should be of the same size (number of char) t238=地址 t239=大小 t240=值 t241=格式 //next 2 probably can't be translated t242=小尾数法 t243=大尾数法 t244=数据存储器偏移 //Tool tips t245=存储器地址 t246=字节数 t247=下一个使用的值 t248=假定地址相对于数据存储器而不是程序存储器 t249=高位在高地址 t250=高位在低地址 //----Retry dialog //Button captions t251=放弃 t252=重试 t253=忽略 //Dialog title t254=警告 //----Notes dialog //Dialog title t255=编辑器件注解 //----Progress dialog //Dialog title t256=状态 //----Hardware check dialog t257=硬件检查 //----About dialog t258=关闭声音 //---- Oscillator Calibration Byte t260=振荡器校准字节 t261=读振荡器校准字节&O t262=振荡器校准选项... t263=读振荡器校准字节成功 t264=芯片ID t265=注解 t266=EEPROM容量 t267=FLASH容量 t268=自动增量 t269=每次设置序列号操作后增量序列号 t270=不进行写操作无法知道bank循环能力,您想写吗? t271=缓冲已更改。在读之前保存? t272=打开程序内存(FLASH)文件 t273=打开数据内存(EEPROM)文件 t274=保存程序内存(FLASH)文件 t275=保存数据内存(EEPROM)文件 t276=新建窗口 t277=开始编程 t278=执行脚本 t279=打开设置对话框 t280=将所有器件擦除为FF t281=保密位与配置位&B... t282=保密位与配置位 //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/spanish.utf0000644000175000017500000002277713616566001016053 0ustar carstencarstenLANGUAGE_NAME spanish LANGUAGE_CHARSET UTF-8 t0=español t1=Traductor: t2=Daniel Lebrero\nJuan Pluma Avila\nAlejandro Segade\nJose Enríquez\n t3=Programador de Dispositivos Serie t4=Descargar la última versión de t5=en la dirección: t6=Sin Nombre //Button captions t7=Aceptar t8=Cancelar t9=Ayuda t10=Probar t12=Nota t13=Editar //Dialog messages t14=Versión t15=Si t16=No t17=Ok t18=Probar t19=Falló t20=Acerca de t21=Página t22=Desconocido t23=El buffer \"%s\"ha cambiado. ¿Guardar antes de cerrar? t24=El buffer \"%s\"ha cambiado. ¿Guardar antes de abrir? t25=Nada que guardar t26=Nada que cargar t27=Nada que imprimir t28=Nada que escribir t29=Nada que verificar t30=Calibración velocidad Bus.\nAsegurate que no haya otras aplicaciones arrancadas t31=\n(La CPU y el disco duro tienen que estar sin actividad\nLa calibración puede tardar unos segundos.\n¿Quieres hacer la calibración ahora? t32=Calibrado t33=Falló la Calibración t34=Necesitas hacer la Calibración (que está en el menu de Opciones)\nantes de poder leer o escribir t35=Necesitas Configurar (que está en el menu Opciones)\nantes de poder leer o escribir t36=Leyendo... t37=Leído correctamente\nTamaño dispositivo: t38=¿Estas seguro de que quieres escribir el dispositivo?\nEl contenido que tuviera se perderá t39=Escribiendo... t40=Verificando... t41=Escrito correctamente t42=Fallo la escritura t43=Borrando... t44=Borrado correctamente //t40=Verificando... t45=No puedo verificar, no encuentro el dispositivo o falla t46=Falló la verificación t47=Verificado correctamente t48=Programado correctamente t49=Falló la programación t50=Dispositivo reiniciado t51=Escribiendo bits de seguridad... t52=Falló la escritura de los bits de seguridad t53=Leyendo bits de seguridad t54=Falló la lectura de los bits de configuración t55=Leyendo bits configuración t56=Falló la lectura de los bits de configuración t57=Escribiendo bits configuración t58=Falló la escritura de los bits de configuración t64=Buffer vacío t65=Operación no implementada t66=Introduzca los parámetros t67=Parámetros incorrectos t68=Aceptando los comandos... t69=Abriendo archivo de contenido del dispositivo t72=Archivo no encontrado t73=No pude guardar t74=Guardar contenido del dispositivo en archivo como t75=Guardar contenido del programa (FLASH) en archivo como t76=Guardar contenido de datos (EEPROM) en archivo como t77=Has cerrado la ultima ventana: ¿Quieres salir del programa?""Close last window: do you want to exit? t78=El buffer cambió. ¿Lo guardo antes de cerrar? //Menu entries //Main Menu t80=&Archivo t81=&Edición t82=&Dispositivo t83=&Comando t85=&Utilidad t86=Con&figuración t87=&Opciones t88=&? //Menu File t89=&Nueva Ventana t90=&Abrir archivo de dispositivo... t91=Abrir archivo de &Programa (FLASH)... t92=Abrir archivo de &Datos (EEPROM)... t93=&Guardar archivo de dispositivo t94=Guardar archivo de dispositivo &como... t95=Guardar archivo de Programa (&FLASH) como... t96=Guardar archivo de Datos (&EEPROM) como... t97=&Reabrir archivos t98=&Imprimir... t99=&Cerrar t100=&Salir //Menu Edit t101=Editar &Nota... t102=Editar bu&ffer //Menu Command t103=&Leer todo t104=Leer Programa (FLASH) t105=Leer Datos (EEPROM) t106=Leer Bits Seguridad y Configuración t107=&Escribir Todo t108=Escribir Programa (&FLASH) t109=Escribir Datos (EEPROM) t110=Escribir Bits Seguridad y Configuración t111=&Verificar todo t112=Verificar Programa (FLASH) t113=Verificar Datos (EEPROM) t114=Verific&ar Bits Seguridad y Configuración t115=&Borrar t116=&Obtener Información t117=Reini&ciar t118=&Programar t119=Opciones del Programa... //Menu Options t120=Conf&iguración de Interfaz... t121=Calibración t122=Modo &Remoto //Menu Utility t123=&Borrar Buffer t124=&Llenar Buffer... t125=&Doble Banco t126=&Intercambiar Byte t127=Poner &Número de Serie t128=C&onfiguración Número de serie... //Menu Help t129=&Ayuda t130=Acerca de //Menu Options t131=Archivo &Log... //Tool Bar //Dialog Messages t136=Tipo Disp. //Tool tips t137=Abrir Fichero Dispositivo t138=Guardar Fichero Dispositivo t139=Imprimir Buffer t140=Reabrir archivos t141=Leer Dispositivo t142=Leer Memoria Programa (FLASH) t143=Leer Memoria Datos (EEPROM) t144=Leer Bits Seguridad y Configuración t145=Grabar Dispositivo t146=Grabar Memoria de Programa (FLASH) t147=Grabar Memoria de Datos (EEPROM) t148=Verificar Memoria de Programa (FLASH) t149=Verificar Memoria de Datos (EEPROM) t150=Verificar Bits Seguridad y Configuración t151=Seleccionar familia dispositivo t152=Seleccionar tipo dispositivo t153=Editar notas de dispositivo //Error Messages t154=El dispositivo no responde t155=Dispositivo erróneo, selecciona el tipo correcto t156=Dispositivo desconectado o desconocido t157=No puedo probar, dispositivo estropeado o bloqueado t158=Cancelado por el Usuario t159=Puerto de Comunicaciones no disponible t160=Denegado acceso a E/S. Debes ser 'root' para acceder a las E/S t161=Placa de programador no encontrada t162=Error de Hardware, ¿Está la placa bien conectada? t163=Bus ocupado o error de Hardware t164=No he recibido Acknowledge desde el dispositivo t165=Dispositivo no encontrado t166='Timeout' en el bus t167=Error en condición 'I2CBus Stop' (¿'Timing' erroneo?) t168=Error Grabando t169=Error durante chequeo si esta vacío t170=Error n. //----Setup dialog //Dialog title t172=Configuración del puerto E/S t173=Configuración de la placa de Interfaz //Dialog messages t174=interfaz COM/LPT t175=Serie t176=Paralelo t177=Selección Interfaz t178=Tipo interfaz t179=Selección Puerto COM t180=COM t183=Selección Puerto LPT t184=LPT t185=Seleccionar Polaridad de las líneas de control t186=Invertir Reset t187=Invertir SCKL t188=Invertir D-IN t189=Invertir D-OUT //Tool tips t190=Seleccionar puerto serie COM t192=Seleccionar puerto paralelo LPT //----Fill dialog //Dialog title t193=Llenar Buffer //Dialog messages: NB should be of the same size (number of char) t194=Desde t195=a t196=Valor //----Fuse dialog //Button captions t197=Borrar Todo t198=Marcar Todo t199=Escribir t200=Leer //Dialog title t201=Bits Configuración y Seguridad //Dialog messages: NB should be of the same size (number of char) t202=Primer Bloque a proteger t203=N. de Bloques a proteger t204=Bloque de alta duración //Tool tips t205=Todos los bits a '0' t206=Todos los bits a '1' t207=Grabar bits en el dispositivo t208=Leer bits del dispositivo //----Info dialog //Button captions t209=Cerrar //Dialog title t210=Información Dispositivo //Dialog messages t211=Capacidad 'Bank roll-over': t212=Tamaño: t213=CRC: t214=Bloque Seguridad: t215=Bloque alta duración: //----Char Edit dialog //Dialog title t216=Editar Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Caracter //Tool tips t222=Valor Hexadecimal t223=Valor Decimal t224=Valor Caracter //----Program Option dialog //Dialog title t225=Opciones de Programa //Dialog messages t226=Reabrir Archivos t227=Leer Memoria de Programa (FLASH) t228=Leer Memoria de Datos (EEPROM) t229=Leer Número de Serie t230='Swap' de Byte t231=Poner Número de Serie t232=Borrar t233=Escribir Memoria de Programa (FLASH) t234=Escribir Memoria de Datos (EEPROM) t235=Escribir Bits Seguridad y Configuración t236=Verificar Bits Seguridad y Configuración //----Serial Number dialog //Dialog title t237=Configurar Número de Serie //Dialog messages: NB should be of the same size (number of char) t238=Dirección t239=Tamaño t240=Valor t241=Formato //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Offset Memoria de Datos //Tool tips t245=Dirección de Memoria t246=Tamaño en bytes t247=Próximo valor a usar t248=Asumir la dirección relativa a Memoria de Datos en vez de Memoria de Programa t249=Byte más significativo en dirección alta t250=Byte más significativo en dirección baja //----Retry dialog //Button captions t251=Parar t252=Reintentar t253=Ignorar //Dialog title t254=Alerta //----Notes dialog //Dialog title t255=Editar Notas de Dispositivo //----Progress dialog //Dialog title t256=Estado //Script t84=Scri&pt t132=&Editar... t133=&Cargar y Ejecutar... t134=&AutoEjecución t135=&Ejectuar t59=Error de Script en la línea t60=Comando erroneo t61=Arguneto erroneo t62=Falta argumento t63=Aun así quiere continuar? t79=Open script file t171=Error en el Script t70=Abrir programa (FLASH) contendio en archivo t71=Abrir Datos (EEPROM) contenidos file t220=Insertar un nuevo valor t221=Introduzca texto en el lugar t258=Desabilitar Sonido //---- Oscillator Calibration Byte t260=Calibración del Byte de Oscilador t261=Leer el Byte de Oscilador t262=Optiones del Byte de Oscilador t263=Lectura del Byte de Oscilador Exitosa t264=Id Chip t265=Nota t266=Tamaño EEPROM t267=Tamaño FLASH t268=Auto Incremento t269=Incrementar número de serie después de cada operación 'Poner Número de Serie' t270=No puedo hacer 'Bank roll-over' sin modificar y escribir ¿Quieres escribir? t271=Buffer cambiado. ¿Guardar lo antes de leer? t272=Abrir Archivo Memoria de Programa (FLASH) t273=Abrir Archivo Memoria de Datos (EEPROM) t274=Guardar Archivo Memoria de Programa (FLASH) t275=Guardar Archivo Memoria de Datos (EEPROM) t276=Nueva Ventana t277=Lanzar Ciclo de Programa t278=Ejecutar script t279=Abrir Diálogo de Setup t280=Borrar Todo el Dispositivo a FF t281=Configuración de Seguridad &Bits... t282=Bits de Configuración y Seguridad //These strings are added to the 'Configuration and security bits' dialog to explain t283=Por favor refiérase a la hoja de datos del dispositivo t284=Elementos seleccionados significan programados t285=Elementos no seleccionados significan no programados tmp9balx013/lang/nederlands.utf0000644000175000017500000002147313616566001016515 0ustar carstencarstenLANGUAGE_NAME nederlands LANGUAGE_CHARSET UTF-8 t0=Nederlands t1=Vertaald door: t2=Roel Aerts\nFrank Hamaekers t3=Serieel Device Programmer t4=Download laatste versie van t5=op het adres: t6=Zonder Naam //Button captionsate t7=OK t8=Afbreken t9=Help t10=Test t12=Note t13=Bewerken //Dialog messages t14=Versie t15=Ja t16=Nee t17=Ok t18=Test t19=Mislukt t20=Over t21=Pagina t22=Onbekend t23=Buffer \"%s\"verandert. Schrijf het weg voor het sluiten? t24=Buffer verandert. Schrijf het weg voor het openen? t25=Niets weg te schrijven t26=Niets te laden t27=Niets te printen t28=Niets te schrijven t29=Niets te vergelijken t30=Bus timing calibreren.\nLet op dat er geen applikaties lopen behalve t31=\n(de CPU en de hard disk niet inbedrijf)\nDe calibratie duurt enkele seconden.\nWil je nu calibreren? t32=Calibratie OK t33=Calibratie mislukt t34=Je moet calibreren van uit het Opties menu\nvoor enige lees/schrijf operatie t35=Je moet eerst Setup uitvoeren in het Opties menu\nvoor enige lees/schrijf operatie t36=Lezen... t37=Lezen geslaagd\nDevice grootte: t38=Weet je zeker het device te beschrijven?\nDe huidige inhoud gaat verloren t39=Schrijven... t40=Vegelijken... t41=Beschrijven gelukt t42=Beschrijven mislukt t43=Wissen... t44=Wissen gelukt //t40=Vergelijken... t45=Kan niet vergelijken, device weg of slecht device t46=Vergelijken mislukt t47=Vergelijken gelukt t48=Programma gelukt t49=Programma mislukt t50=Device resetten t51=Schrijf beveiliging bits... t52=Beveiliging bits schrijven mislukt t53=Lees security bits... t54=Configuratie bits lezen mislukt t55=Lees configuratie bits... t56=Configuratie bits lezen mislukt t57=Schrijf configuratie bits... t58=Configuratie bits schrijven mislukt t64=Buffer leeg t65=Operatie niet ondersteunt t66=Geef parameters in t67=Verkeerde parameters t68=Accepteer commando... t69=Open device inhouds file t72=File niet gevonden t73=File save mislukt t74=Schrijf Device inhouds file weg als t75=Schrijf Programma (FLASH) inhouds file weg als t76=Schrijf Data (EEPROM) inhouds file weg als t77=Sluit laatste venster: wil je sluiten? t78=Buffer verandert. Eerst weg schrijven dan sluiten? //Menu entries //Main Menu t80=&Bestand t81=&Bewerken t82=&Device t83=&Commando t85=&Utility t86=&Instellingen t87=&Opties t88=&? //Menu File t89=&Nieuw Venster t90=&Open device bestand... t91=Open &programma (FLASH) bestand... t92=Open &data (EEPROM) bestand... t93=&Schrijf device bestand weg t94=Schrijf device bestand weg &als... t95=Schrijf programma (&FLASH) bestand weg als... t96=Schrijf data (&EEPROM) bestand weg als... t97=&Herlaad bestand t98=&Afdrukken... t99=&Sluiten t100=&Einde //Menu Edit t101=Bewerken &Noteer... t102=Bewerken Bu&ffer mogelijk //Menu Command t103=&Lees alles t104=Lees programma (FLASH) t105=Lees data (EEPROM) t106=Lees &beveiliging en configuratie bits t107=&Beschrijf alles t108=Beschrijf programma (&FLASH) t109=Beschrijf data (EEPROM) t110=Be&schrijf beveiliging and configuratie bits t111=&Vergelijk Alles t112=Vergelijk Programma (FLASH) t113=Vergelijk Data (EEPROM) t114=Vergelijk& Beveiliging en Configuratie Bits t115=&Wissen t116=&Haal Info t117=Rese&t t118=&Programma t119=Programma Opties... //Menu Options t120=&Interface instellingen... t121=&Calibratie t122=&Bedien op afstand //Menu Utility t123=&Maak Buffer leeg t124=&Vull Buffer... t125=&Doubleer Bank t126=&Byte Omruilen t127=Zet Serie&nummer t128=Serienummer Instellen... //Menu Help t129=&Help t130=&Info //Menu Options t131=&Logbestand... //Tool Bar //Dialog Messages t136=Dev.Type //Tool tips t137=Open Device bestand t138=Schrijf Device bestand weg t139=Print Buffer t140=Herlaad bestanden t141=Lees Device t142=Lees Programma Geheugen (FLASH) t143=Lees Data Geheugen (EEPROM) t144=Lees Beveiliging en Configuratie Bits t145=Beschrijf Device t146=Beschrijf Programma Geheugen (FLASH) t147=Beschrijf Data Geheugen (EEPROM) t148=Vergelijk Programma Geheugen (FLASH) t149=Vergelijk Data Geheugen (EEPROM) t150=Vergelijk Beveiliging en Configuratie Bits t151=Selecteer device family t152=Selecteer device type t153=Bewerk device notities //Error Messages t154=Device Antwoord Niet t155=Slecht device, selecteer het goede type t156=Device niet aanwezig of onbekend device t157=Geen toegang, slecht device of device gesloten t158=Door Gebruiker gestopt t159=Communicatie poort niet beschikbaar t160=I/O toegang afgewezen. Je moet Administrator zijn voor I/O toegang t161=Programmeer hardware niet gevonden t162=Hardware fout, is het goed aangesloten? t163=Bus bezig of hardware fout t164=Geen terugmelding van het device t165=Device niet aanwezig t166=Timeout van de bus t167=I2CBus Stop conditie fout (slechte timing?) t168=Schrijf fout t169=Leeg check fout t170=Fout nr. //----Setup dialog //Dialog title t172=I/O poort instelling t173=Interface board instelling //Dialog messages t174=COM/LPT interface t175=Serieel t176=Parallel t177=Interface selectie t178=Interface type t179=COM Poort selectie t180=COM t183=LPT Poort selectie t184=LPT t185=Selecteer Polariteit van de besturingslijnen t186=Invert Reset t187=Invert SCKL t188=Invert D-IN t189=Invert D-OUT //Tool tips t190=Selecteer seriële poort COM t192=Selecteer parallelle poort LPT //----Fill dialog //Dialog title t193=Vul Buffer //Dialog messages: NB should be of the same size (number of char) t194=Van t195=Naar t196=Waarde //----Fuse dialog //Button captions t197=Wis Alles t198=Zet Alles t199=Schrijf t200=Lees //Dialog title t201=Configuratie en Beveiliging bits //Dialog messages: NB should be of the same size (number of char) t202=Eerste Blok op Slot t203=N. Bloks op Slot t204=High endurance blok //Tool tips t205=Alle bits op '0' t206=Alle bits op '1' t207=Schrijf bits naar het device t208=Lees bits van het device //----Info dialog //Button captions t209=Sluit //Dialog title t210=Device Info //Dialog messages t211=Bank verwissel mogelijkheid: t212=Grootte: t213=CRC: t214=Beveiliging blok: t215=High endurance blok: //----Char Edit dialog //Dialog title t216=Bewerk Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimaal t219=Karakter //Tool tips t222=Hexadecimale waarde t223=Decimale waarde t224=Kar. waaarde //----Program Option dialog //Dialog title t225=Programma keuze's //Dialog messages t226=Herlaad bestanden t227=Lees programma geheugen (FLASH) t228=Lees data geheugen (EEPROM) t229=Lees serienummer t230=Byte verruilen t231=Zet serienummer t232=Wis t233=Beschrijf programma geheugen (FLASH) t234=Beschrijf bata geheugen (EEPROM) t235=Beschrijf beveiliging en configuratie bits t236=Vergelijk beveiliging en configuratie bits //----Serial Number dialog //Dialog title t237=Serienummer configuratie //Dialog messages: NB should be of the same size (number of char) t238=Adres t239=Grootte t240=Waarde t241=Formaat //next 2 probably can't be translated t242=Lage ending t243=Hoge ending t244=Data Geheugen offset //Tool tips t245=Geheugen adres t246=Grootte in bytes t247=Volgende Waarde om te gebruiken t248=Neem het Adres relatief aan Data geheugen in plaats van Programma geheugen t249=Meest significante Byte op hoge adres t250=Meest significante Byte op laag adres //----Retry dialog //Button captions t251=Afbreken t252=Opnieuw t253=Negeren //Dialog title t254=Let op //----Notes dialog //Dialog title t255=Bewerk Device Notities //----Progress dialog //Dialog title t256=Status //Script t84=Scri&pt t132=&Bewerken... t133=&Laden en uitvoeren... t134=&Automatisch laden t135=&Uitvoeren t59=Script-fout op regel t60=Verkeerde opdracht t61=Verkeerd argument t62=Argument niet aanwezig t63=Wilt u doorgaan? t79=Script-bestand openen t171=Script-fout t70=Inhoud programma-bestand (FLASH) openen t71=Inhoud data-bestand (EEPROM) openen t220=Vul de nieuwe waarde in t221=Geef de tekst op van positie t258=Geen geluid //---- Oscillator Calibration Byte t260=Oscillator kalibratie-byte t261=Osc. kalibratie-byte lezen t262=Osc. kalibratie opties... t263=Osc. kalibratie-byte succesvol gelezen t264=Chip Identificatie t265=Notitie t266=EEPROM grootte t267=FLASH grootte t268=Automatisch ophogen t269=Verhoog het serienummer na elke 'set serial number' operatie t270=Bank roll-over onbekend zonder modificeren en schrijven, wilt u schrijven? t271=Buffer veranderd. Opslaan voor lezen? t272=Laad Programma Geheugen (FLASH) Bestand t273=Laad Data Geheugen (EEPROM) Bestand t274=Bewaar Programma Geheugen (FLASH) Bestand t275=Bewaar Data Geheugen (EEPROM) Bestand t276=Nieuw venster t277=Start programmeer cyclus t278=Uitvoeren script t279=Open instellingen dialoog t280=Wis hele device naar FF //"Device"can be translated to"apparaat", however earlier translations speak of device, so I did the same here. t281=Beveiliging en Configuratie &Bits... t282=Beveiliging en Configuratie Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Zie gegevensblad van device a.u.b. t284=Aangevinkt betekent geprogrammeerd t285=Niet aangevinkt betekent niet geprogrammeerd tmp9balx013/lang/norwegian.utf0000644000175000017500000002061313616566001016362 0ustar carstencarstenLANGUAGE_NAME norwegian LANGUAGE_CHARSET UTF-8 t0=nprwegian //Fill this with your reference, if it's empty""it will be invisible t1=Oversatt av: t2=NPF-tax555 tax555@hotmail.com t3=Seriell Programmerer t4=Last ned siste versjon av t5=på addressen: t6=Ingen Navn //Button captions t7=OK t8=Avbryt t9=Hjelp t10=Test t11=Sjekk Hardware t12=Merk t13=Rediger //Dialog messages t14=Versjon t15=Ja t16=Nei t17=Ok t18=Test t19=Mislykkes t20=Om t21=Side t22=Ukjent t23=Buffer \"%s\"endret. Lagre før du avslutter? t24=Buffer endret. Lagre den før du åpner? t25=Ingenting å lagre t26=Ingenting å åpne t27=Ingenting å skrive ut t28=Ingenting å skrive t29=Ingenting å verifisere t30=Buss tids Kalibrering.\nKontroller at det ikke er andre applikasjoneron son kjører før t31=\n(CPU'n og hard disken må være i hvilemodus)\nKalibreringen kan ta noen sekunder.\nVil du starte kalibreringen nå? t32=Kalibrering OK t33=Kalibrering misslyktes t34=Du må kjøre Kalibreringen fra Alternativ menyen\nfør noen lese/skrive operasjoner t35=Oppsett må kjøres fra Alternativ menyen\nfør noen lese/skrive operasjoner t36=Leser... t37=Lesing vellykket\nStørrelse: t38=Er du sikker på at du vil skrive til enheten?\nAlt tidligere innhold vil gå tapt t39=skriver... t40=Veifiserer... t41=Skriving vellykket t42=Skrivingen mislykket t43=Sletter... t44=Sletting vellykket t45=Kan ikke verifisere, enheten mangler eller den er defekt t46=Verifisering Mislykket t47=Verifisering vellykket t48=Programmering vellykket t49=Programmering Mislykket t50=Nullstill enhet t51=Skriver sikkerhets bits... t52=Sikkerhets bits skriving mislykket t53=Leser sikkerhets bits... t54=Sikkerhets bits lesing mislykket t55=Leser konfigurerings bits... t56=Konfigurerings bits lesing mislykket t57=Skriver konfigurerings bits... t58=Konfigurerings bits skriving mislykket t59=Skript feil på linje t60=Feil kommando t61=Feil parameter t62=Parameter savnes t63=Vil du fortsette? t64=Buffer tom t65=Handlingen støttes ikke t66=Sett inn parametere t67=Feil parametere t68=Tillater kommandoer... t69=Åpne fil t70=Åpne programfil (FLASH) t71=Åpne datafil (EEPROM) t72=Fil ikke funnet t73=Kunne ikke lagre fil t74=Lagre som t75=Lagre Programfil (FLASH) som t76=Lagre Datafil (EEPROM) som t77=Steng forrige vindo: Vil du avslutte? t78=Buffer endret. Lagre før du avslutter? t79=Åpne skript fil //Menu entries //Main Menu t80=&Fil t81=&Rediger t82=&Enhet t83=&Kommando t84=Skri&pt t85=&Verktøy t86=&Oppsett t87=&Alternativ t88=&? //Menu File t89=&Nytt vindu t90=&Åpne Fil... t91=Åpne &Programfil (FLASH)... t92=Åpne &Datafil (EEPROM)... t93=&Lagre Fil t94=Lagre Fil &Som... t95=Lagre Programfil (&FLASH) Som... t96=Lagre Datafil (&EEPROM) Som... t97=Åpne ig&jen t98=Skriv &ut... t99=&Lukk t100=A&vslutt //Menu Edit t101=&Redigeringsbemerkning... t102=Aktiver &bufferredigering //Menu Command t103=&Les Alt t104=Les Program (FLASH) t105=Les Data (EEPROM) t106=Les &Sikkerhets og Konfigurerings Bits t107=&Skriv Alt t108=Skriv Program (&FLASH) t109=Skriv Data (EEPROM) t110=Sk&riv Sikkerhets og Konfigurerings Bits t111=&Verifiser Alt t112=Verifiser Program (FLASH) t113=Verifiser Data (EEPROM) t114=Verif&iser Sikkerhets og Konfigurerings Bits t115=&Slett t116=&Informasjon t117=Null&still t118=&Program t119=Program Alternativ... //Menu Options t120=&Grensesnitt... t121=&Kalibrering t122=&Fjern Modus //Menu Utility t123=&Slett Buffer t124=&Fyll Buffer... t125=&Dobbel Bank t126=&Byte Bytte t127=Velg Serie&Nummer t128=SeriNummer K&onfigurering... //Menu Help t129=&Hjelp t130=&Om //Menu Options t131=&Logg Fil... //Menu Script t132=&Rediger... t133=&Åpne og Kjør... t134=&Auto Åpne t135=&Kjør //Tool Bar //Dialog Messages t136=Enhets Type //Tool tips t137=Åpne Fil t138=Lagre Fil t139=Skriv ut Buffer t140=ReÅpne Filer t141=Les Enhet t142=Les Program Minne (FLASH) t143=Les Data Minne (EEPROM) t144=Les Sikkerhets og Konfigurerings Bits t145=Skriv Enhet t146=Skriv Program Minne (FLASH) t147=Skriv Data Minne (EEPROM) // t148=Verifiser Program Minne (FLASH) t149=Verifiser Data Minne (EEPROM) t150=Verifiser Sikkerhets og Konfigurerings Bits t151=Velg enhets familie t152=Velg enhets type t153=Rediger enhetsbemerkninger //Error Messages t154=Enhet Svarer Ukke t155=Feil Enhet, velg korrekt type t156=Enheten savnes eller ukjent enhet t157=Kunne ikke teste, feil enhet eller enhet låst t158=Avbrutt av Bruker t159=Kommunikasjons port ikke tilgjengelig t160=I/O tilgang nektes. Du må være root for å utføre I/O t161=Programmererkortet ikke funnet t162=Hardware feil, er kortet ordentlig tilkoblet? t163=Buss opptatt eller hardware feil t164=Savner Bekreftelse fra enheten t165=Savner enhet t166=Timeout på bussen t167=I2CBus Stop feil (feil timing?) t168=Skrive feil t169=Blank sjekk feil t170=Feil n. t171=Skript feil //----Setup dialog //Dialog title t172=I/O port Oppsett t173=Kort Oppsett //Dialog messages t174=COM/LPT grensesnitt t175=Seriell t176=Parallell t177=Grensesnitt alternativ t178=Grensesnitt type t179=COM Port valg t180=COM t183=LPT Port valg t184=LPT t185=Velg Polaritet på Kontroll linjene t186=Inverter Reset t187=Inverter SCKL t188=Inverter D-IN t189=Inverter D-OUT //Tool tips t190=Velg seriell port COM t192=Velg parallell port LPT //----Fill dialog //Dialog title t193=Fyll Buffer //Dialog messages: NB should be of the same size (number of char) t194=Fra. t195=Til t196=Verdi //----Fuse dialog //Button captions t197=Slett Alt t198=Velg Alt t199=Skriv t200=Les //Dialog title t201=Konfigurerings og Sikkerhets bits //Dialog messages: NB should be of the same size (number of char) t202=Første Blokk å Låse t203=N.av Blokker å Låse t204=Høyt varighets blokk //Tool tips t205=Alle bits til '0' t206=Alle bits til '1' t207=Skriv bits til enheten t208=Les bits fra enheten //----Info dialog //Button captions t209=Lukk //Dialog title t210=Enhets Info //Dialog messages t211=Bank roll-over dugelighet: t212=Størrelse: t213=CRC: t214=Sikkerhets blokk: t215=Høyt varighets blokk: //----Char Edit dialog //Dialog title t216=Rediger Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Desimal t219=Char t220=Sett inn ny verdi t221=Skriv tekst fra addressen //Tool tips t222=Hexadesimal verdi t223=Desimal verdi t224=Char verdi //----Program Option dialog //Dialog title t225=Program Alternativ //Dialog messages t226=ReÅpne Filer t227=Les Program minne (FLASH) t228=Les Data minne (EEPROM) t229=Les Serie Nummer t230=Byte Bytte t231=Velg Serie Nummer t232=Slett t233=Skriv Program minne (FLASH) t234=Skriv Data minne (EEPROM) t235=Skriv Sikkerhets og Konfig bits t236=Verifiser Sikkerhets og Konfig bits //----Serial Number dialog //Dialog title t237=Serie Nummer Konfig //Dialog messages: NB should be of the same size (number of char) t238=Adresse t239=Str. t240=Verdi t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Data minne offset //Tool tips t245=Minne adresse t246=Størrelse i bytes t247=Neste verdi som brukes t248=Anta Adressen relativt til Data minnet i stedet for Program minnet t249=Mest signifikante Byte at høy adresse t250=Mest signifikante Byte på lav adresse //----Retry dialog //Button captions t251=Avbryt t252=Prøv Igjen t253=Ignorer //Dialog title t254=Alarm //----Notes dialog //Dialog title t255=Rediger Enhetsbemerkninger //----Progress dialog //Dialog title t256=Status //----Hardware check dialog t257=Hardware Sjekk //----About dialog t258=Deaktiver lyd //---- Oscillator Calibration Byte t260=Oscillator kalibrerings Byte t261=Les Osc.Kalibrerings Byte t262=Osc. Kalibrerings Alternativ... t263=Lest Osc.Kalibreringd Byte vellykket t264=Chip Id t265=Bemerk t266=EEPROM Størrelse t267=FLASH Størrelse t268=Automatisk Økning t269=Øk serie nummeret etter hvert 'valgte serie nummer' handling t270=Kan ikke vete bank roll-over uten å modifisere og skrive, Vil du fortsette å skrive? t271=Buffer endret. Lagre det før lesing? t272=Åpne Program Minne (FLASH) Fil t273=Åpne Data Minne (EEPROM) Fil t274=Lagre Program Minne (FLASH) Fil t275=Lagre Data Minne (EEPROM) Fil t276=Nytt vindu t277=Start program syklus t278=Kjør skript t279=Åpne oppsett dialog t280=Slett alt fra enheten til FF t281=Sikkerhets og Konfigurerings &Bits... t282=Sikkerhets og Konfigurerings Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Vennligst konfigurer med databladet, takk t284=Merkede enheter betyr at de er programert. t285=Umerkede enheter betyr at de ikke er programet. tmp9balx013/lang/romaneste.utf0000644000175000017500000002223113616566001016364 0ustar carstencarstenLANGUAGE_NAME romaneste LANGUAGE_CHARSET UTF-8 t0=romaneste //Fill this with your reference, if it's empty""it will be invisible t1=Translator t2= t3=Programator de Circuite Seriale t4=Obtineti ultima versiune a t5=la adresa: t6=Fara Nume //Button captions t7=OK t8=Anulare t9=Ajutor t10=Proba t11=Verificare Hardware t12=Note t13=Editare //Dialog messages t14=Versiune t15=Da t16=Nu t17=Ok t18=Test t19=Nereusit t20=Despre t21=Pagina t22=Necunoscut t23=Buffer \"%s\"modificat. Salvati inainte de inchidere? t24=Buffer modificat. Salvati inainte de inchidere? t25=Nimic de salvat t26=Nimic de incarcat t27=Nimic de printat t28=Nimic de scris t29=Nimic de verificat t30=Calibrarea timpului de bus.\nAsigurati-va ca nu ruleaza alte aplicatii in afara de t31=\n(CPU si hard disk-ul trebuie sa fie in repaus)\nCalibrarea poate dura cateva secunde.\nDoriti sa rulati calibrarea acum? t32=Calibrare reusita t33=Calibrare nereusita t34=Trebuie rulat Calibrare din meniul de Optiuni\ninaintea oricarei operatii de citire/scriere t35=Trebuie rulat Setup din meniul de Optiuni\ninaintea oricarei operatii de citire/scriere t36=Citire... t37=Citire reusita\nMarime Circuit: t38=Sunteti sigur ca doriti sa scrieti circuitul?\nTot continutul anterior se va pierde t39=Scriere... t40=Verificare... t41=Scriere reusita t42=Scriere nereusita t43=Stergere... t44=Stergere reusita t45=Nu se poate verifica, circuit lipsa sau circuit defect t46=Verificare nereusita t47=Verificare reusita t48=Programare reusita t49=Programare nereusita t50=Reset circuit t51=Scriere biti de securitate... t52=Scriere biti de securitate nereusita t53=Citire biti de securitate... t54=Citire biti de securitate nereusita t55=Citire biti de configurare... t56=Citire biti de configurare nereusita t57=Scriere biti de configurare... t58=Scriere biti de configurare nereusita t59=Eroare de script la linia t60=Comanda eronata t61=Argument eronat t62=Argument lipsa t63=Doriti sa continuati? t64=Buffer gol t65=Operatie nesuportata t66=Inserati parametri t67=Parametri eronati t68=Acceptare comenzi... t69=Deschidere fisier continut circuit t70=Deschidere fisier continut program (FLASH) t71=Deschidere fisier continut date (EEPROM) t72=Fisierul nu a fost gasit t73=Salvare fisier nereusita t74=Salvare fisier continut circuit ca t75=Salvare fisier continut program (FLASH) ca t76=Salvare fisier continut date (EEPROM) ca t77=Inchide ultima fereastra: doriti sa iesiti? t78=Buffer modificat. Salvati inainte de inchidere? t79=Deschidere fisier script //Menu entries //Main Menu t80=&Fisier t81=&Editare t82=&Circuit t83=Co&manda t84=Scri&pt t85=&Utilitare t86=&Setup t87=&Optiuni t88=&? //Menu File t89=Fereastra &Noua t90=Deschide Fisier &Circuit... t91=Deschide Fisier &Program (FLASH)... t92=Deschide Fisier &Date (EEPROM)... t93=Sa&lvare Fisier Circuit t94=Salvare Fisier Circuit C&a... t95=Salvare Fisier Program (&FLASH) Ca... t96=Salvare Fisier Data (&EEPROM) Ca... t97=&Reincarcare Fisier t98=Prin&tare... t99=&Inchidere t100=Ie&sire //Menu Edit t101=Editare &Note... t102=Editare Bu&ffer activata //Menu Command t103=&Citire Completa t104=Citire Program (FLASH) t105=Citire Data (EEPROM) t106=Citire &Biti de Securitate si Configuratie t107=&Scriere Completa t108=Scriere Program (&FLASH) t109=Scriere Data (EEPROM) t110=Scriere Biti de Securitate si Confi&guratie t111=&Verificare Completa t112=Verificare Program (FLASH) t113=Verificare Data (EEPROM) t114=Verificare Biti de Securitate si Config&uratie t115=S&tergere t116=Obtinere &Informatii t117=&Reset t118=&Programare t119=Optiuni Programare... //Menu Options t120=&Setup Interfata... t121=&Calibrare t122=Comanda la &Distanta //Menu Utility t123=&Stergere Buffer t124=&Umplere Buffer... t125=&Dublare Bank t126=&Byte Swap t127=Setup &numar de serie t128=&Configurare numar de serie... //Menu Help t129=&Ajutor t130=&Despre //Menu Options t131=&Fisier Log... //Menu Script t132=&Editare... t133=&Incarcare si Rulare... t134=&Auto incarcare t135=&Rulare //Tool Bar //Dialog Messages t136=Tip circuit //Tool tips t137=Deschidere Fisier Circuit t138=Salvare Fisier Circuit t139=Printare Buffer t140=Reincarcare Fisier t141=Citire Circuit t142=Citire Memorie Program (FLASH) t143=Citire Memorie Date (EEPROM) t144=Citire Biti de Securitate si Configuratie t145=Scriere circuit t146=Scriere Memorie Program (FLASH) t147=Scriere Memorie Data (EEPROM) t148=Verificare Memorie Program (FLASH) t149=Verificare Memorie Date (EEPROM) t150=Verificare Biti de Securitate si Configuratie t151=Selectati familia circuitului t152=Selectati tipul circuitului t153=Editare note circuit //Error Messages t154=Circuitul nu raspunde t155=Circuit eronat, selectati tipul corect t156=Circuit lipsa sau circuit necunoscut t157=Probare imposibila, circuit defect sau circuit protejat t158=Abandonare utilizator t159=Portul de comunicatie nu e disponibil t160=Acces I/O nepermis. Trebuie sa fiti in radacina pentru operatii I/O t161=Placa de programare nu a fost gasita t162=Eroare hardware, placa de programare este conectata corect? t163=Bus ocupat sau eroare hardware t164=Circuitul nu raspunde t165=Circuitul lipseste t166=Depasire timp pe bus t167=Eroare conditie de Stop pe bus-ul I2C (timpi incorecti?) t168=Eroare de scriere t169=Eroare de testare circuit sters t170=Eroare nr. t171=Eroare de script //----Setup dialog //Dialog title t172=Setup port I/O t173=Setup interfata placa de programare //Dialog messages t174=Interfata COM/LPT t175=Serial t176=Paralel t177=Selectare interfata t178=Tip interfata t179=Selectare port COM t180=COM t183=Selectare port LPT t184=LPT t185=Selectare Polaritate linii de Control t186=Reset Inversat t187=SCKL Inversat t188=D-IN Inversat t189=D-OUT Inversat //Tool tips t190=Selectare port serial COM t192=Selectare port paralel LPT //----Fill dialog //Dialog title t193=Umplere Buffer //Dialog messages: NB should be of the same size (number of char) t194=De la t195=La t196=Valoare //----Fuse dialog //Button captions t197=Stergere Completa t198=Setup Complet t199=Scriere t200=Citire //Dialog title t201=Biti de Configurare si Securitate //Dialog messages: NB should be of the same size (number of char) t202=Primul Block de Protejat t203=Nr. Blockuri de Protejat t204=Block cu anduranta ridicata //Tool tips t205=Toti bitii la '0' t206=Toti bitii la '1' t207=Scriere biti in circuit t208=Citire biti de la circuit //----Info dialog //Button captions t209=Inchidere //Dialog title t210=Informatii Circuit //Dialog messages t211=Capabilitate de bank roll-over: t212=Marime: t213=CRC: t214=Block de Securitate: t215=Block cu anduranta ridicata: //----Char Edit dialog //Dialog title t216=Editare Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hexa t218=Zecimal t219=Caracter t220=Introduceti noua valoare t221=Introduceti text de la adresa //Tool tips t222=Valoare hexazecimala t223=Valoare zecimala t224=Valoare caracter //----Program Option dialog //Dialog title t225=Optiuni Programare //Dialog messages t226=Reincarcare Fisier t227=Citire Memorie Program (FLASH) t228=Citire Memorie Date (EEPROM) t229=Citire Numar de Serie t230=Byte Swap t231=Setup Numar de Serie t232=Stergere t233=Scriere Memorie Program (FLASH) t234=Scriere Memorie Date (EEPROM) t235=Scriere Biti de Securitate si Configurare t236=Verificare Biti de Securitate si Configurare //----Serial Number dialog //Dialog title t237=Configurare Numar de Serie //Dialog messages: NB should be of the same size (number of char) t238=Adresa t239=Marime t240=Valoare t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Offset Memorie Date //Tool tips t245=Adresa Memorie address t246=Marimea in byti t247=Urmatoarea valoare de utilizat t248=Adresa relativa la memoria de date in loc de memoria program t249=Cel mai semnificativ byte la adresa superioara t250=Cel mai semnificativ byte la adresa inferioara //----Retry dialog //Button captions t251=Anulare t252=Reincercare t253=Ignora //Dialog title t254=Alerta //----Notes dialog //Dialog title t255=Editare Note Circuit //----Progress dialog //Dialog title t256=Stare //----Hardware check dialog t257=Verificare Hardware //----About dialog t258=Dezactivare sunet //---- Oscillator Calibration Byte t260=Byte Calibrare Oscilator t261=Citire Byte Calibrare Oscilator t262=Optiuni Calibrare Oscilator... t263=Citire Byte Calibrare Oscilator reusita t264=Id Circuit t265=Note t266=Marime EEPROM t267=Marime FLASH t268=Auto Incrementare t269=Incrementare numar serial dupa fiecare operatie 'setup numar serial' t270=Nu se poate cunoaste capabilitatea de bank roll-over fara a modifica si a scrie, doriti sa scrieti? t271=Buffer modificat. Salvati inainte de citire? t272=Deschide Fisier Program in Memorie (FLASH) t273=Deschide Fisier Date in Memorie (FLASH) t274=Salveaza Fisier Program in Memorie (FLASH) t275=Salveaza Fisier Date in Memorie (FLASH) t276=Fereastra &Noua t277=Lanseaza Program t278=Executa Script t279=Deschide Dialogul de Configurare t280=Sterge toate circuitele pina la FF t281=&Biti de securitate si configurare... t282=Biti de securitate si configurare... //These strings are added to the 'Configuration and security bits' dialog to explain t283=Consultati documentatia device-ului t284=Casutele bifate inseamna programate t285=Casutele nebifate inseamna neprogramate tmp9balx013/lang/italiano.utf0000644000175000017500000002313513616566001016173 0ustar carstencarstenLANGUAGE_NAME italiano LANGUAGE_CHARSET UTF-8 t0=italiano t1=Traduttori: t2= t3=Programmatore Dispositivi Seriali t4=Scarica l'ultima versione di t5=all'indirizzo: t6=Senza Nome //Button captions t7=OK t8=Annulla t9=Aiuto t10=Prova t12=Note t13=Edit //Dialog messages t14=Versione t15=Si t16=No t17=Ok t18=Test t19=Fallito t20=About t21=Pagina t22=Sconosciuto t23=Buffer \"%s\"modificato. Vuoi salvarlo prima di chiudere? t78=Buffer modificato. Vuoi salvarlo prima di chiudere? t24=Buffer modificato. Vuoi salvarlo prima di aprire? t77=Sto chiudendo l'ultima finestra: vuoi uscire dal programma? t25=Niente da salvare t26=Niente da caricare t27=Niente da stampare t28=Niente da scrivere t29=Niente da verificare t30=Calibrazione delle temporizzazioni sul Bus.\nAssicurati che non ci siano altre applicazioni aperte oltre a PonyProg t31=\n(la CPU e il disco fisso devono essere a riposo, led spento)\nLa calibrazione può durare qualche decina di secondi.\nVuoi lanciare la calibrazione ora? t32=Calibrazione OK t33=Calibrazione fallita t34=Devi lanciare la Calibrazione dal menu Opzioni\nprima di ogni operazione di lettura/scrittura t35=Devi modificare le impostazioni nel menu Opzioni-Impostazioni\nprima di ogni operazione di lettura scrittura t36=Sto leggendo il dispositivo... t37=Lettura ultimata con successo\nDimensione del dispositivo: t38=Sei sicuro di voler scrivere il dispositivo?\nTutto il contenuto precedente verrà perduto t39=Sto scrivendo... t40=Sto verificando... t41=Scrittura ultimata con successo t42=Scrittura fallita t43=Sto cancellando... t44=Cancellazione ultimata t45=Non posso effettuare la verifica\nDispositivo mancante o errato t46=Verifica fallita t47=Verifica ultimata con successo t48=Programmazione ultimata t49=Programmazione fallita t50=Dispositivo resettato t51=Sto scrivendo i bit di sicurezza... t52=Scrittura dei bit di sicurezza fallita t53=Sto leggendo i bit di sicurezza... t54=Lettura dei bit di sicurezza fallita t55=Sto leggendo i bit di configurazione... t56=Lettura dei bit di configurazione fallita t57=Sto scrivendo i bit di configurazione... t58=Scrittura dei bit di configurazione fallita t64=Buffer vuoto t65=Operazione non supportata t66=Inserisci i parametri t67=Parametri sbagliati t68=Accetto comandi... t69=Apertura del file per il dispositivo t72=File non trovato t73=Salvataggio del File fallito t74=Salvataggio del File per il dispositivo t75=Salvataggio del File di Programma (FLASH) t76=Salvataggio del File di Dati (EEPROM) //Menu entries //Main Menu t80=&File t81=&Edit t82=&Dispositivi t83=&Comandi t85=&Utilità t86=&Impostazioni t87=&Opzioni t88=&? //Menu File t89=&Nuova Finestra t90=&Apri File del Dispositivo... t91=Apri File di &Programma (FLASH)... t92=Apri File di &Dati (EEPROM)... t93=&Salva File del Dispositivo t94=Salva File del Dispositivo con &Nome... t95=Salva File di Programma (&FLASH) con Nome... t96=Salva File di Dati (EEPR&OM) con Nome... t97=&Ricarica i File t98=&Stampa... t99=&Chiudi t100=&Esci //Menu Edit t101=Edit &Note... t102=Modifica Bu&ffer abilitata //Menu Command t103=&Leggi Tutto t104=Leggi Memoria Pro&gramma (FLASH) t105=Leggi Memoria &Dati (EEPROM) t106=Leggi &Bit di Configurazione e Sicurezza t107=&Scrivi Tutto t108=Scrivi Memoria Programma (&FLASH) t109=Scrivi Memoria Dati (&EEPROM) t110=Scrivi Bi&t di Configurazione e Sicurezza t111=&Verifica Tutto t112=Verifica Memoria Progra&mma (FLASH) t113=Verific&a Memoria Dati (EEPROM) t114=Verifica Bit di Configurazione e Sicure&zza t115=&Cancella t116=&Informazioni t117=&Reset t118=Esegui &Programmazione t119=&Opzioni di Programmazione... //Menu Setup t120=&Scheda di Interfaccia... t121=&Calibrazione t122=&Modalita` Remota //Menu Utility t123=&Ripulisci Buffer t124=R&iempi Buffer... t125=Ra&ddoppia Banchi t126=&Scambia Byte t127=Scarica &Numero di Serie t128=&Configurazione Numero di Serie... //Menu Help t129=&Aiuto t130=&Informazioni //Menu Options t131=&Log File... //Tool Bar //Dialog Messages t136=Modello //Tool Tips t137=Apri File Dispositivo t138=Salva File Dispositivo t139=Stampa Buffer t140=Ricarica Files t141=Leggi Dispositivo t142=Leggi Memoria Programma (FLASH) t143=Leggi Memoria Dati (EEPROM) t144=Leggi Bit di Configurazione e Sicurezza t145=Scrivi Dispositivo t146=Scrivi Memoria Programma (FLASH) t147=Scrivi Memoria Dati (EEPROM) t148=Verifica Memoria Programma (FLASH) t149=Verifica Memoria Data (EEPROM) t150=Verifica Bit di Configurazione e Sicurezza t151=Seleziona la famiglia di dispositivi t152=Seleziona il tipo di dispositivo t153=Modifica Note Dispositivo //Error Messages t154=Il dispositivo non risponde t155=Dispositivo sbagliato, seleziona il modello corretto t156=Dispositivo mancante o sconosciuto t157=Non posso rilevare il modello, dispositivo bloccato o danneggiato t158=Interruzione da parte dell'utente t159=Porta di comunicazione non disponibile t160=Operazione di I/O non permessa. Devi eseguirla come utente Root t161=Scheda del programmatore non rilevata t162=Errore hardware, la scheda è collegata correttamente? t163=Bus impegnato o errore sull'hardware t164=Risposta dal dispositivo non pervenuta t165=Dispositivo mancante t166=Timeout sul bus t167=Errore nella condizione di Stop sul bus I2CBus (temporizzazione sbagliata?) t168=Errore generico di scrittura t169=Errore eprom non cancellata t170=Errore n. //----Setup dialog //Dialog title t172=Impostazioni porta di I/O t173=Impostazioni Scheda di interfaccia //Dialog messages t174=Interfaccia COM/LPT t175=Seriale t176=Parallela t177=Seleziona Interfaccia t178=Tipo di Interfaccia t179=Seleziona Porta COM t180=COM t183=Seleziona Porta LPT t184=LPT t185=Seleziona la polarità delle linee di controllo t186=Inverti Reset t187=Inverti SCKL t188=Inverti D-IN t189=Inverti D-OUT //Tool tips t190=Seleziona la porta seriale COM t192=Seleziona la porta parallela LPT //----Fill dialog //Dialog title t193=Riempi Buffer //Dialog messages t194=Da t195=A t196=Valore //----Fuse dialog //Button captions t197=Azzera Tutto t198=Imposta Tutto t199=Scrivi t200=Leggi //Dialog title t201=Bit di Configurazione e Sicurezza //Dialog messages t202=Primo blocco da proteggere t203=Numero di blocchi da proteggere t204=Blocco ad elevata durata //Tool tips t205=Imposta tutti i bit a '0' t206=Imposta tutti i bit a '1' t207=Scrivi i bit nel dispositivo t208=Legge i bit dal dispositivo //----Info dialog //Button captions t209=Chiudi //Dialog title t210=Informazioni sul Dispositivo //Dialog messages t211=Caratteristica dello 'sforamento del banco': t212=Dimensione: t213=CRC: t214=Blocco protetto: t215=Blocco ad elevata durata: //----Char Edit dialog //Dialog title t216=Modifica Buffer //Dialog messages: NB should be of the same size (number of char) t217=Esadecimale t218=Decimale t219=Carattere //Tool tips t222=Valore esadecimale t223=Valore decimale t224=Valore carattere //----Program Option dialog //Dialog title t225=Opzioni di Programmazione //Dialog messages t226=Ricarica i File t227=Leggi Memoria Progamma (FLASH) t228=Leggi Memoria Dati (EEPROM) t229=Leggi Numero di Serie t230=Scambia Byte t231=Imposta Numero di Serie t232=Cancella t233=Scrivi Memoria Programma (FLASH) t234=Scrivi Memoria Dati (EEPROM) t235=Scrivi Bit di Configurazione e Sicurezza t236=Verifica Bit di Configurazione e Sicurezza //----Serial Number dialog //Dialog title t237=Configurazione Numero di Serie //Dialog messages: NB should be of the same size (number of char) t238=Indirizzo t239=Dimensione t240=Valore t241=Formato //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Scostamento dalla Memoria Dati //Tool tips t245=Indirizzo di memoria t246=Dimensione in byte t247=Prossimo valore da usare t248=Considera l'indirizzo relativo alla memoria Dati anziché quella Programma t249=Cifra più significativa nell'indirizzo di memoria alto t250=Cifra più significativa nell'indirizzo di memoria basso //----Retry dialog //Button captions t251=Interrompi t252=Riprova t253=Ignora //Dialog title t254=Attenzione //----Notes dialog //Dialog title t255=Modifica Note al Dispositivo //----Progress dialog //Dialog title t256=Stato //Script t84=Scri&pt t132=&Edit... t133=&Apri ed Esegui... t134=&Caricamento automatico t135=&Esegui t59=Errore nello script alla linea t60=Comando errato t61=Parametro errato t62=Parametro mancante t63=Vuoi continuare? t79=Apri il file di script t171=Errore nello script t70=Apri il file di programma (FLASH) t71=Apri il file dati (EEPROM) t220=Inserisci il nuovo valore t221=Inserisci il testo dalla locazione t258=Disabilita il suono //---- Oscillator Calibration Byte t260=Byte di Calibrazione Oscillatore t261=Leggi Byte di Calibrazione Oscillatore t262=Configura Byte di Calibrazione Oscillatore... t263=Lettura Byte di Calibrazione Oscillatore terminata con successo t264=Chip Id t265=Note t266=Dimensione EEPROM t267=Dimensione FLASH t268=Auto Incremento t269=Incrementa il numero seriale dopo ogni impostazione t270=Non posso conoscere lo la caratteristica dello 'sforamento del banco'\nsenza modificare e scrivere, vuoi continuare? t271=Buffer modificato. Vuoi salvarlo prima di leggere? t272=Apri File di Programma (FLASH) t273=Apri File di Dati (EEPROM) t274=Salva File di Programma (FLASH) con Nome t275=Salva File di Dati (EEPROM) con Nome t276=Nuova Finestra t277=Esegui ciclo di programmazione t278=Esegui script t279=Apri finestra di dialogo di setup t280=Cancella tutto il dispositivo al valore FF t281=&Bit di Configurazione e Sicurezza t282=Bit di Configurazione e Sicurezza t283=Consulta il datasheet del dispositivo t284=Il bit selezionato significa programmato t285=Il bit non selezionato significa non programmato t286=Salva il risultato nel buffer alla locazione indicata t287=Preferenze t288=Assicurati che VTarget sia ON (controlla il jumper J3) e di non avere nessun dispositivo 'target' collegato tmp9balx013/lang/portuguese.utf0000644000175000017500000002251413616566001016575 0ustar carstencarstenLANGUAGE_NAME portuguese LANGUAGE_CHARSET UTF-8 t0=Portugues t1=Translator Credits: t2=Pedro Dias t3=Programador de Dispositivos Serie t4=Descarregar a última versão t5=no endereço WEB: t6=Sem Nome //Button captions t7=Aceitar t8=Cancelar t9=Ajuda t10=Testar t12=Nota t13=Editar //Dialog messages t14=Versão t15=Sim t16=Não t17=Ok t18=Testar t19=Falhou t20=Acerca de t21=Página t22=Desconhecido t23=O buffer \"%s\"foi modificado. Guardar antes de fechar? t24=O buffer \"%s\"foi modificado. Guardar antes de abrir? t25=Nada que guardar t26=Nada que carregar t27=Nada que imprimir t28=Nada que escrever t29=Nada que verificar t30=Calibração da velocidade Bus.\nAssegure-se que não hajaa outras aplicacações abertas t31=\n(A CPU e o disco duro têm de estar inactivos\nA calibração pode demorar alguns segundos.\nQuer fazer a calibração agora? t32=Calibração OK t33=A calibração falhou t34=É necessário fazer a Calibração (no menu Opcões)\nantes de poder ler ou gravar t35=É ncessário correr a configuração (no menu Opcões)\nantes de poder ler ou gravar t36=A Ler... t37=Lido correctamente\nTamanho do dispositivo: t38=Tem a certeza que quer gravar o dispositivo?\nOs dados que tiver serão apagados t39=A Escrever... t40=A Verificar... t41=Gravado correctamente t42=Falhou a gravação t43=A Apagar... t44=Apagado correctamente //t40=A verificar... t45=Não posso verificar, não foi encontrado o dispositivo ou este falhou t46=Falhou a verificação t47=Verificado correctamente t48=Programado correctamente t49=Falhou a programação t50=Dispositivo reiniciado t51=A gravar bits de segurança... t52=Falhou a gravação dos bits de segurança t53=A Ler bits de segurança t54=Falhou a leitura dos bits de configuração t55=A Ler bits de configuração t56=Falhou a leitura dos bits de configuração t57=A gravar bits de configuração t58=Falhou a gravação dos bits de configuração t64=Buffer vazio t65=Operacção não implementada t66=Introduza os parametros t67=Parametros incorrectos t68=A aceitar comandos... t69=A Abrir ficeiro de conteudo do dispositivo t72=Ficheiro não encontrado t73=Falha na gravação t74=Guardar conteudo do dispositivo no ficheiro como t75=Guardar conteudo do programa (FLASH) no ficheiro como t76=Guardar conteudo de dados (EEPROM) no ficheiro como t77=Foi fechada a última janela: Quer sair do programa?""Close last window: do you want to exit? t78=O buffer foi modificado. Quer gravar antes de fechar? //Menu entries //Main Menu t80=&Ficheiro t81=&Editar t82=&Dispositivo t83=&Comando t85=&Utilitários t86=Con&figuração t87=&Opções t88=&? //Menu File t89=&Nova Janela t90=&Abrir ficheiro de dispositivo... t91=Abrir ficheiro de &Programa (FLASH)... t92=Abrir ficheiro de &Dados (EEPROM)... t93=&Guardar ficheiro de dispositivo t94=Guardar ficheiro de dispositivo &como... t95=Guardar ficheiro de Programa (&FLASH) como... t96=Guardar ficheiro de Dados (&EEPROM) como... t97=&Reabrir ficheiros t98=&Imprimir... t99=&Fechar t100=&Sair //Menu Edit t101=Editar &Nota... t102=Editar bu&ffer //Menu Command t103=&Ler tudo t104=Ler Programa (FLASH) t105=Ler Dados (EEPROM) t106=Ler Bits de Segurança e Configuração t107=&Gravar Tudo t108=Gravar Programa (&FLASH) t109=Gravar Dados (EEPROM) t110=Gravar Bits de Segurança e Configuração t111=&Verificar tudo t112=Verificar Programa (FLASH) t113=Verificar Dados (EEPROM) t114=Verific&ar Bits de Segurança e Configuração t115=&Apagar t116=&Obter Informação t117=Reini&ciar t118=&Programar t119=Opcções do Programa... //Menu Options t120=Conf&iguración de Interface... t121=Calibração t122=Modo &Remoto //Menu Utility t123=&Apagar Buffer t124=&Encher Buffer... t125=&Banco Duplo t126=&Intercambiar Byte t127=Acertar &Número de Serie t128=&Configuração de Número de serie... //Menu Help t129=&Ajuda t130=Acerca de //Menu Options t131=Ficheiro &Log... //Tool Bar //Dialog Messages t136=Tipo Disp. //Tool tips t137=Abrir Fichero Dispositivo t138=Guardar Fichero Dispositivo t139=Imprimir Buffer t140=Reabrir ficheiros t141=Ler Dispositivo t142=Ler Memoria de Programa (FLASH) t143=Ler Memoria de Dados (EEPROM) t144=Ler Bits de segurança e Configuração t145=Gravar Dispositivo t146=Gravar Memória de Programa (FLASH) t147=Gravar Memória de Dados (EEPROM) t148=Verificar Memória de Programa (FLASH) t149=Verificar Memória de Dados (EEPROM) t150=Verificar Bits de Segurança e Configuração t151=Seleccionar familia do dispositivo t152=Seleccionar tipo do dispositivo t153=Editar notas de dispositivo //Error Messages t154=O dispositivo não responde t155=Dispositivo erróneo, seleccione o tipo correcto t156=Dispositivo desconectado ou desconhecido t157=Não posso testar, dispositivo erróneo ou bloqueado t158=Cancelado pelo utilizador t159=Porta de Comunicações não disponivel t160=Negado accesso a E/S. Deve ser 'root' para aceder ás E/S t161=Placa do programador não encontrada t162=Erro de Hardware, Estará a placa bem conectada? t163=Erro de Hardware ou Bus ocupado t164=Não foi recebido \"Acknowledge\"do dispositivo t165=Dispositivo não encontrado t166='Timeout' no bus t167=Erro na condição 'I2CBus Stop' (¿'Timing' erroneo?) t168=Erro na gravação t169=Erro durante a verificação de vazio t170=Erro n. //----Setup dialog //Dialog title t172=Configuração da porta E/S t173=Configuração da placa de Interface //Dialog messages t174=interface COM/LPT t175=Série t176=Paralelo t177=Selecção de Interface t178=Tipo de interface t179=Selecção Porta COM t180=COM t183=Selecção da porta LPT t184=LPT t185=Seleccione Polaridade das linhas de controlo t186=Inverter Reset t187=Inverter SCKL t188=Inverter D-IN t189=Inverter D-OUT //Tool tips t190=Seleccionar porta série COM t192=Seleccionar porta paralela LPT //----Fill dialog //Dialog title t193=Encher Buffer //Dialog messages: NB should be of the same size (number of char) t194=Desde t195=a t196=Valor //----Fuse dialog //Button captions t197=Apagar Tudo t198=Marcar Tudo t199=Gravar t200=Ler //Dialog title t201=Bits Configuración y Seguridad //Dialog messages: NB should be of the same size (number of char) t202=Primeiro Bloco a proteger t203=N. de Blocos a proteger t204=Bloco de alta endurance //Tool tips t205=Todos os bits a '0' t206=Todos os bits a '1' t207=Gravar bits para o dispositivo t208=Ler bits do dispositivo //----Info dialog //Button captions t209=Fechar //Dialog title t210=Informação do Dispositivo //Dialog messages t211=Capacidade 'Bank roll-over': t212=Tamanho: t213=CRC: t214=Bloco de segurança: t215=Bloco de alta endurance: //----Char Edit dialog //Dialog title t216=Editar Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Caracter //Tool tips t222=Valor Hexadecimal t223=Valor Decimal t224=Valor Caracter //----Program Option dialog //Dialog title t225=Opções do Programa //Dialog messages t226=Reabrir ficheiros t227=Ler Memória de Programa (FLASH) t228=Ler Memória de Dados (EEPROM) t229=Ler Número de Série t230=Intercambiar Byte t231=Acertar Número de Serie t232=Apagar t233=Gravar Memória de Programa (FLASH) t234=Gravar Memória de Dados (EEPROM) t235=Gravar Bits de Segurança e Configuração t236=Verificar Bits de Segurança e Configuração //----Serial Number dialog //Dialog title t237=Configurar Número de Serie //Dialog messages: NB should be of the same size (number of char) t238=Endereço t239=Tamanho t240=Valor t241=Formato //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Offset de Memoria de Dados //Tool tips t245=Endereço de Memoria t246=Tamanho em bytes t247=Próximo valor a usar t248=Assumir endereços relativos á Memoria de Dados em vez de Memoria de Programa t249=Byte mais significativo no endereço alto t250=Byte mais significativo no endereço baixo //----Retry dialog //Button captions t251=Parar t252=Repetir t253=Ignorar //Dialog title t254=Alerta //----Notes dialog //Dialog title t255=Editar Notas de Dispositivo //----Progress dialog //Dialog title t256=Estado //Script t84=Scri&pt t132=&Editar t133=Carregar e Correr t134=Carregar &Automatico t135=&Correr t59=Erro de Script na linha t60=Commando errado t61=Argumento errado t62=Argumento em falta t63=Deseja continuar? t79=Abrir ficheiro de Script t171=Erro de Script t70=Abrir ficheiro de programa (FLASH) t71=Abrir ficheiro de dados (EEPROM) t220=Inserir a nova tabela t221=Introduzir texto de um local t258=Desligar som //---- Oscillator Calibration Byte t260=Byte de Calibração do Oscilador t261=Ler Byte de Calibração do Oscilador t262=Opções de Calibração do Oscilador t263=Byte de Calibração do Osccilador Lido com sucesso t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/swedish.utf0000644000175000017500000002076513616566001016047 0ustar carstencarstenLANGUAGE_NAME swedish LANGUAGE_CHARSET UTF-8 t0=swedish //Fill this with your reference, if it's empty""it will be invisible t1=Översättning av: t2=R. Sundquist & T. Backlund, reviderad av HE t3=Seriell programmerare t4=Ladda hem den senaste versionen av t5=på adressen: t6=Inget namn //Button captions t7=OK t8=Avbryt t9=Help t10=Testa t11=Testar hårdvara t12=Anmärkning t13=Ändra //Dialog messages t14=Version t15=Ja t16=Nej t17=Ok t18=Testa t19=Misslyckades t20=Om t21=Sida t22=Okänt t23=Buffert \"%s\"ändrad. Spara innan avslut? t24=Buffert ändrad. Spara innan öppning? t25=Inget att spara t26=Inget att öppna t27=Inget att skriva ut t28=Inget att skriva t29=Inget att verifiera t30=Busstidskalibrering.\nKontrollera att inga andra applikationer körs förutom t31=\n(CPU:n och hårddisken måste vara i viloläge)\nKalibreringen kan ta några sekunder.\nVill du starta kalibreringen nu? t32=Kalibrering OK t33=Kalibreringen misslyckades t34=Kalibreringen måste köras från menyn Alternativ\nföre någon läs/skriv-operation t35=Setup måste köras från menyn Alternativ\nföre någon läs/skriv-operation t36=Läser... t37=Inläsning lyckades\nStorlek: t38=Är du säker på att du vill göra en inläsning?\nAll tidigare information kommer att förstöras t39=Skriver... t40=Verifierar... t41=Skrivningen lyckades t42=Skrivningen misslyckades t43=Raderar... t44=Raderingen lyckades t45=Kan inte verifiera, enheten saknas eller defekt t46=Verifieringen misslyckades t47=Verifieringen lyckades t48=Programmeringen lyckades t49=Programmeringen misslyckades t50=Enhet återställd t51=Skriver säkerhetsbitar... t52=Skrivning av säkerhetsbitar misslyckades t53=Läser säkerhetsbitar... t54=Inläsning av säkerhetsbitar misslyckades t55=Läser konfigurationsbitar... t56=Inläsning av konfigurationsbitar misslyckades t57=Skriver konfigurationsbitar... t58=Skrivning av konfigurationsbitar misslyckades t59=Skriptfel på rad t60=Felaktigt kommando t61=Felaktig parameter t62=Parameter saknas t63=Vill du fortsätta? t64=Buffert tom t65=Stöd saknas för operationen t66=Infoga parameter t67=Felaktig parameter t68=Kommandon accepterade... t69=Öppna Fil t70=Öppna Programfil (FLASH) t71=Öppna Datafil (EEPROM) t72=Filen hittades inte t73=Filen gick inte att spara t74=Spara Fil som... t75=Spara Programfilen (FLASH) som... t76=Spara Datafilen (EEPROM) som... t77=Stäng senaste fönster: vill du avsluta? t78=Buffert ändrad. Spara innan avslut? t79=Öppnar skriptfil //Menu entries //Main Menu t80=&Arkiv t81=&Redigera t82=&Enhet t83=&Kör t84=Skri&pt t85=&Verktyg t86=&Setup t87=&Alternativ t88=&? //Menu File t89=&Nytt Fönster t90=&Öppna Fil... t91=Öppna &Programfil (FLASH)... t92=Öppna &Datafil (EEPROM)... t93=&Spara Fil t94=Spara Fil so&m... t95=Spara Programfil (&FLASH) som... t96=Spara Datafil (&EEPROM) som... t97=Öppna i&gen t98=Skriv &ut... t99=St&äng t100=A&vsluta //Menu Edit t101=&Redigeringsanteckning... t102=Aktivera &bufferredigering //Menu Command t103=&Läs alla t104=Läs Program (FLASH) t105=Läs Data (EEPROM) t106=Läs säkerhets- och ko&nfigurationsbitar t107=Skr&iv alla t108=Skriv Program (&FLASH) t109=Skriv Data (EEPROM) t110=Skriv säkerhets- och konfig&urationsbitar t111=&Verifiera alla t112=Verifiera Program (FLASH) t113=Verifiera Data (EEPROM) t114=Verif&iera säkerhets- och konfigurationsbitar t115=&Radera t116=&Information t117=&Återställ t118=&Program t119=Programalternativ... //Menu Options t120=&Gränssnitt... t121=&Kalibrering t122=&Fjärrläge //Menu Utility t123=&Radera buffert t124=&Fyll buffert... t125=&Dubbla bank t126=&Byte swap t127=Välj serialnu&mmer t128=Serienummer k&onfiguration... //Menu Help t129=&Hjälp t130=&Om //Menu Options t131=&Loggfil... //Menu Script t132=&Redigera... t133=&Ladda och kör... t134=&Autoladda t135=&Kör //Tool Bar //Dialog Messages t136=Enhetstyp //Tool tips t137=Öppna fil t138=Spara fil t139=Skriv ut buffert t140=Ladda om filer t141=Läs enhet t142=Läs Programminne (FLASH) t143=Läs Dataminne (EEPROM) t144=Läs säkerhets- och konfigurationsbitar t145=Skriv enhet t146=Skriv Programminne (FLASH) t147=Skriv Dataminne (EEPROM) t148=Verifiera Programminne (FLASH) t149=Verifiera Dataminne (EEPROM) t150=Verifiera säkerhets- och konfigurationsbitar t151=Välj enhetsfamilj t152=Välj enhetstyp t153=Redigera enhetsnotering //Error Messages t154=Enheten svarar inte t155=Felaktig enhet, välj rätt typ t156=Enheten är okänd eller saknas t157=Går ej att testa, felaktig enhet eller låst t158=Användaren avbryter t159=Kommunikationsporten otillgänglig t160=I/O-tillträde saknas. Du måste vara root för att tillgå I/O t161=Programmeringskortet hittades ej t162=Hårdvarufel, är kortet korrekt kopplat? t163=Bussen upptagen eller hårdvarufel t164=Saknar bekräftelse från enheten t165=Saknar enhet t166=Timeout på bussen t167=I2CBus error (felaktig timing?) t168=Skrivfel t169=Tomt checkfel t170=Fel n. t171=Skriptfel //----Setup dialog //Dialog title t172=I/O portsetup t173=Kortsetup //Dialog messages t174=COM/LPT gränssnitt t175=Seriell t176=Parallel t177=Gränssnitt t178=Gränssnittstyp t179=COM-portsval t180=COM t183=LPT-portsval t184=LPT t185=Välj polaritet på kontrolllinorna t186=Invertera Reset t187=Invertera SCKL t188=Invertera D-IN t189=Invertera D-OUT //Tool tips t190=Välj COM t192=Välj LPT //----Fill dialog //Dialog title t193=Fyll buffert //Dialog messages: NB should be of the same size (number of char) t194=Från t195=Till t196=Värde //----Fuse dialog //Button captions t197=Radera allt t198=Välj allt t199=Skriv t200=Läs //Dialog title t201=Konfigurations- och säkerhetsbitar //Dialog messages: NB should be of the same size (number of char) t202=Första blocket att låsa t203=Antal block att låsa t204=High endurance block //Tool tips t205=Alla bitar till '0' t206=Alla bitat till '1' t207=Skriv bitar till enhet t208=Läs bitar från enhet //----Info dialog //Button captions t209=Stäng //Dialog title t210=Enhetsinformation //Dialog messages t211=Bank roll-over-förmåga: t212=Storlek: t213=CRC: t214=Säkerhetsblock: t215=High endurance block: //----Char Edit dialog //Dialog title t216=Redigera buffert //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Char t220=Infoga nytt värde t221=Skriv text från adressen //Tool tips t222=Hexadecimalt värde t223=Decimalt värde t224=Char-värde //----Program Option dialog //Dialog title t225=Programalternativ //Dialog messages t226=Ladda om filer t227=Läs programminne (FLASH) t228=Läs dataminne (EEPROM) t229=Läs serienummer t230=Byte Swap t231=Välj serienummer t232=Radera t233=Skriv programminne (FLASH) t234=Skriv dataminne (EEPROM) t235=Skriv säkerhets- och konfigurationsbitar t236=Verifiera säkerhets- och konfigurationsbitar //----Serial Number dialog //Dialog title t237=Serienummerinställning //Dialog messages: NB should be of the same size (number of char) t238=Adress t239=Storlek t240=Värde t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Dataminnes-offset //Tool tips t245=Minnnesadress t246=Storlek i bytes t247=Nästa värde t248=Antag Adressen relativt till Dataminnet iställetför Programminnet t249=Mest signifikanta bit på hög adress t250=Mest signifikanta bit på låg adress //----Retry dialog //Button captions t251=Avbryt t252=Försök igen t253=Ignorera //Dialog title t254=Varning //----Notes dialog //Dialog title t255=Redigera enhetsnotering //----Progress dialog //Dialog title t256=Status //----Hardware check dialog t257=Hårdvarukontroll //----About dialog t258=Koppla bort ljud //---- Oscillator Calibration Byte t260=Oscillator-kalibreringsbyte t261=Läs Osc.kalibreringsbyte t262=Osc.kalibrering Alternativ... t263=Läsning av Osc.kalibreringsbyte lyckades t264=Chip Id t265=Notering t266=EEPROM-storlek t267=FLASH-storlek t268=Automatisk ökning t269=Öka serienumret efter varje 'Välj serienummer'-operation t270=Kan inte veta 'bank roll-over' utan att skriva, vill du skriva? t271=Buffert ändrad. Spara innan läsning? t272=Öppna Program Minnes (FLASH) Fil t273=Öppna Data Minnes (EEPROM) Fil t274=Spara Program Minnes (FLASH) Fil t275=Spara Data Minnes (&EEPROM) Fil t276=Nytt Fönster t277=Kör program cycle t278=Kör script t279=Instälningar t280=Radera Hela enheten (till FF) t281=Säkerhet och Konfigurations&bitar... t282=Säkerhet och Konfigurationsbitar //These strings are added to the 'Configuration and security bits' dialog to explain t283=Referera till enhetens datablad, tack t284=Markerade objekt är programmerade t285=Omarkerade objekt är ej programmerade tmp9balx013/lang/czech.utf0000644000175000017500000002043013616566001015462 0ustar carstencarstenLANGUAGE_NAME czech LANGUAGE_CHARSET UTF-8 t0=czech t1=Translator Credits: t2=Dvorak Mirek t3=Seriovy Programator Obvodu t4=Stahnete si nejnovejsi verzi t5=na adrese : t6=Bez Jmena //Button captions t7=OK t8=Zrusit t9=Pomoc t10=Zkouska t12=Poznamka t13=Edituj //Dialog messages t14=Verze t15=Ano t16=Ne t17=Ok t18=Test t19=Chyba t20=Info t21=Strana t22=Neznamy t23=Buffer \"%s\"zmeneny. Ulozit ho pred zavrenim? t24=Buffer zmeneny. Ulozit ho pred otevrenim? t25=Neni co ulozit t26=Neni co nahrat t27=Neni co tisknout t28=Neni co zapsat t29=Neni co kontrolovat t30=Kalibrace casovani sbernice.\nZabezpecte, aby nebezela jina aplikace nez t31=\n(procesor a harddisk maji byt necinne)\nKalibrace muze trvat par sekund...\nChcete ted spustit kalibraci? t32=Kalibrace OK t33=Chybna kalibrace! t34=Musite spustit >Kalibrace< z menu Setup \npred jakymikoli operacemi cteni/zapis t35=Musite spustit Setup programatoru z menu Setup \npred jakymikoli operacemi cteni/zapis t36=Ctu... t37=Cteni uspesne\nKapacita obvodu: t38=Chcete opravdu zacit obvod programovat?\nVsechny udaje v nem budou prepsany t39=Programuji... t40=Kontroluji... t41=Programovani uspesne t42=Programovani CHYBNE ! t43=Mazu... t44=Mazani uspesne //t40=Kontroluji... t45=Nemohu kontrolovat, obvod nebyl nalezen nebo je chybny t46=Kontrola CHYBNA ! t47=Kontrola uspesna t48=Programovani uspesne t49=Programovani CHYBNE ! t50=Reset Obvodu t51=Zapisuji security bity... t52=Zapis security bitu CHYBNE ! t53=Ctu security bity... t54=Cteni konfiguracnich bitu CHYBNE ! t55=Cteni konfiguracnich bitu... t56=Cteni konfiguracnich bitu CHYBNE ! t57=Zapisuji konfiguracni bity... t58=Zapis konfiguracnich bitu CHYBNE ! t64=Buffer prazdny t65=Operace neni podporovana t66=Vloz parametry t67=Spatne parametry t68=Akceptuji prikazy... t69=Otevri soubor s daty t72=Soubor nenalezen t73=Chyba pri ukladani souboru t74=Uloz soubor s daty jako t75=Uloz Program (FLASH) do souboru jako t76=Uloz Data (EEPROM) do souboru Jako t77=Zavri posledni okno: chcete ukoncit program? t78=Buffer zmeneny. Ulozit ho pred zavrenim? //Menu entries //Main Menu t80=&Soubor t81=&Edituj t82=&Obvody t83=&Prikazy t85=&Utility t86=&Setup t87=&Nastaveni t88=&? //Menu File t89=&Nove Okno t90=&Otevri Datovy Soubor... t91=Otevri &Program (FLASH) Soubor... t92=Otevri &Data (EEPROM) Soubor... t93=&Save Device File t94=Uloz Datovy Soubor &Jako... t95=Uloz Program (&FLASH) Soubor Jako... t96=Uloz Data (&EEPROM) Soubor Jako... t97=&Znovunahrani Souboru t98=Nahra&j... t99=&Zavri t100=E&xit //Menu Edit t101=Edituj &Typy... t102=Editace Bu&ffru povolena //Menu Command t103=&Cti Vsechno t104=Cti Program (FLASH) t105=Cti Data (EEPROM) t106=Cti &Security a Configuration Bity t107=&Vypal Vsechno t108=Vypal Program (&FLASH) t109=Vypal Data (EEPROM) t110=Vy&pal Security a Configuration Bity t111=&Zkontroluj Vsechno t112=Zkontroluj Program (FLASH) t113=Zkontroluj Data (EEPROM) t114=Zkontrolu&j Security a Configuration Bity t115=&Vymaz t116=&Info t117=Rese&t t118=&Vypal t119=Nastaveni... //Menu Options t120=&Setup programatoru... t121=&Kalibrace t122=&Dalkovy Rezim //Menu Utility t123=&Vycisti Buffer t124=&Vypln Buffer... t125=&Dvojita Bank t126=&Prehod Byty t127=Nastav Seriove& Cislo t128=Konfig Serioveho C&isla... //Menu Help t129=&Pomocnik t130=&O programu //Menu Options t131=&Log Soubor... //Tool Bar //Dialog Messages t136=Typ.Obvodu //Tool tips t137=Otevri Datovy Soubor t138=Uloz Datovy Soubor t139=Vyttiskni Buffer t140=Znovunahrani Souboru t141=Cti Obvod t142=Cti Program Memory (FLASH) t143=Cti Data Memory (EEPROM) t144=Cti Security a Configuration Bity t145=Vypal Obvod t146=Vypal Program Memory (FLASH) t147=Vypal Data Memory (EEPROM) t148=Kontroluj Program Memory (FLASH) t149=Kontroluj Data Memory (EEPROM) t150=Kontroluj Security and Configuration Bity t151=Vyber druh obvodu t152=Vyber typ obvodu t153=Edituj typ obvodu //Error Messages t154=Obvod Neodpovida t155=Spatny typ obvodu, vyberte spravny t156=Obvod nepripojeny nebo je neznamy t157=Nemozne testovat, spatny nebo zamceny obvod t158=Preruseni uzivatelem t159=Komunikacny port nedostupny t160=I/O pristup zakazany. Musite byt administrator ! t161=Programator nenalezen t162=Chyba hardwaru, je programator dobre pripojeny? t163=Sbernice zatizena nebo chyba hardwaru t164=Zadna Odezva z Obvodu I2C t165=I2C:Nepripojeny Obvod t166=I2C:Cas komunikace uplynul t167=I2C:Chyba komunikace (spatne casovani?) t168=Chyba pri zapisu do obvodu t169=Obvod neni prazdny t170=Chyba c. //----Setup dialog //Dialog title t172=Nastaveni I/O portu t173=Nastaveni programatoru //Dialog messages t174=COM/LPT Programator t175=Seriovy t176=Paralelni t177=Druh t178=Typ t179=Vyber COM Portu t180=COM t183=Vyber LPT Portu t184=LPT t185=Vyber Polaritu Kontrolnich Signalu t186=Invertuj Reset t187=Invertuj SCKL t188=Invertuj D-IN t189=Invertuj D-OUT //Tool tips t190=Vyber seriovy port COM t192=Vyber paralelni port LPT //----Fill dialog //Dialog title t193=Vypln Buffer //Dialog messages: NB should be of the same size (number of char) t194=Od adresy t195=Po adresu t196=Hodnotou //----Fuse dialog //Button captions t197=Vymaz Vsechny t198=Nastav Vsechny t199=Vypal t200=Cti //Dialog title t201=Configuration a Security bity //Dialog messages: NB should be of the same size (number of char) t202=Prvni Blok na Uzamceni t203=Pocet Bloku na Uzamceni t204=High-endurance blok //Tool tips t205=Vsechny bity do '0' t206=Vsechny bity do '1' t207=Vypal bity do obvodu t208=Cti bity z obvodu //----Info dialog //Button captions t209=Zavri //Dialog title t210=Info o Obvode //Dialog messages t211=Podpora 'Bank roll-over' : t212=Velkost: t213=CRC: t214=Security blok: t215=High endurance blok: //----Char Edit dialog //Dialog title t216=Editovat Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hexa t218=Dec. t219=Znaky //Tool tips t222=Hexadecimalni hodnota t223=Decimalni hodnota t224=Znakovy udaj //----Program Option dialog //Dialog title t225=Programovaci Moznosti //Dialog messages t226=Znovunahraj Soubory t227=Cti Program memory (FLASH) t228=Cti Data memory (EEPROM) t229=Cti Seriove Cislo t230=Prehod Bajty t231=Nastav Seriove Cislo t232=Vymaz t233=Zapis Program memory (FLASH) t234=Zapis Data memory (EEPROM) t235=Zapis Security a Config bity t236=Kontroluj Security a Config bity //----Serial Number dialog //Dialog title t237=Konfig serioveho cisla //Dialog messages: NB should be of the same size (number of char) t238=Adresa t239=Velikost t240=Hodnota t241=Format //next 2 probably can't be translated t242=INTEL t243=MOTOROLA t244=Relativne k Datove Pameti //Tool tips t245=Adresa v pameti t246=Velikost v bajtech t247=Hodnota ktera bude pouzita t248=Povoli pouziti Adresy relativni k Datove pameti namisto k Programove pameti t249=MSB na vyssi adrese - INTEL format t250=MSB na nizsi adrese - MOTOROLA format //----Retry dialog //Button captions t251=Zrusit t252=Opakovat t253=Ignorovat //Dialog title t254=Upozorneni //----Notes dialog //Dialog title t255=Editovat typ obvodu //----Progress dialog //Dialog title t256=Stav //Script t84=Skri&pt t132=&Editovani... t133=&Nahraj a Spust ... t134=&Nahraj Automaticky t135=&Spust t59=Chyba ve skriptu na radku t60=Spatny prikaz t61=Spatny argument t62=Chybejici argument t63=Chces pokracovat? t79=Otevri skript t171=Chyba skriptu t70=Otevri programovy (FLASH) soubor t71=Otevri datovy (EEPROM) soubor t220=Vloz novou hodnotu t221=Vloz text z pozice t258=Zrus zvuk //---- Oscillator Calibration Byte t260=Kalibracni Byte Oscilatoru t261=Precti Kalibracni Byte Osc. t262=Moznosti Kalibracniho Bytu Osc... t263=Precteni Kalibracniho Bytu Osc. uspesne t264=Chip Id t265=Poznamka t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Zvys seriove cislo po kazde operaci 'set serial number' t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer zmenen. Ulozit pøed ctenim? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=Nove Okno t277=Launch program cycle t278=Vykonej script t279=Otevri setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/english.utf0000644000175000017500000002101013616566001016012 0ustar carstencarstenLANGUAGE_NAME english LANGUAGE_CHARSET UTF-8 t0=english //Fill this with your reference, if it's empty""it will be invisible t1=Translator Credits: t2= t3=Serial Device Programmer t4=Download last version of t5=at the address: t6=No Name //Button captions t7=OK t8=Cancel t9=Help t10=Probe t11=Hardware Check t12=Note t13=Edit //Dialog messages t14=Version t15=Yes t16=No t17=Ok t18=Test t19=Failed t20=About t21=Page t22=Unknown t23=Buffer \"%s\"changed. Save it before closing? t24=Buffer changed. Save it before opening? t25=Nothing to save t26=Nothing to load t27=Nothing to print t28=Nothing to write t29=Nothing to verify t30=Bus timing calibration.\nBe sure there are no application running other than t31=\n(the CPU and hard disk have to be idle)\nThe calibration may take a couple of seconds.\nDo you want to run calibration now? t32=Calibration OK t33=Calibration failed t34=You need to run Calibration from the Options menu\nbefore any read/write operations t35=You need to run Setup from the Options menu\nbefore any read/write operations t36=Reading... t37=Read successful\nDevice Size: t38=Are you sure you want to write the device?\nAll previous content will be lost t39=Writing... t40=Verifying... t41=Write successful t42=Write failed t43=Erasing... t44=Erase successful t45=Cannot verify, device missing or bad device t46=Verify Failed t47=Verify successful t48=Program successful t49=Program Failed t50=Device reset t51=Writing security bits... t52=Security bits write failed t53=Reading security bits... t54=Security bits read failed t55=Reading configuration bits... t56=Configuration bits read failed t57=Writing configuration bits... t58=Configuration bits write failed t59=Script error at line t60=Bad command t61=Bad argument t62=Argument missing t63=Do you want to continue? t64=Buffer empty t65=Operation not supported t66=Insert parameters t67=Bad parameters t68=Accepting commands... t69=Open device content file t70=Open program (FLASH) content file t71=Open data (EEPROM) content file t72=File not found t73=File save failed t74=Save Device Content File As t75=Save Program (FLASH) Content File As t76=Save Data (EEPROM) Content File As t77=Close last window: do you want to exit? t78=Buffer changed. Save it before closing? t79=Open script file //Menu entries //Main Menu t80=&File t81=&Edit t82=&Device t83=&Command t84=Scri&pt t85=&Utility t86=&Setup t87=&Options t88=&? //Menu File t89=&New Window t90=&Open Device File... t91=Open &Program (FLASH) File... t92=Open &Data (EEPROM) File... t93=&Save Device File t94=Save Device File &As... t95=Save Program (&FLASH) File As... t96=Save Data (&EEPROM) File As... t97=&Reload Files t98=Prin&t... t99=&Close t100=E&xit //Menu Edit t101=Edit &Note... t102=Edit Bu&ffer enabled //Menu Command t103=&Read All t104=Read Program (FLASH) t105=Read Data (EEPROM) t106=Read &Security and Configuration Bits t107=&Write All t108=Write Program (&FLASH) t109=Write Data (EEPROM) t110=Wr&ite Security and Configuration Bits t111=&Verify All t112=Verify Program (FLASH) t113=Verify Data (EEPROM) t114=Verif&y Security and Configuration Bits t115=&Erase t116=&GetInfo t117=Rese&t t118=&Program t119=Program Options... //Menu Options t120=&Interface Setup... t121=&Calibration t122=&Remote Mode //Menu Utility t123=&Clear Buffer t124=&Fill Buffer... t125=&Double Bank t126=&Byte Swap t127=Set Serial&Number t128=SerialNumber C&onfig... //Menu Help t129=&Help t130=&About //Menu Options t131=&Log File... //Menu Script t132=&Edit... t133=&Load and Run... t134=&Auto Load t135=&Run //Tool Bar //Dialog Messages t136=Dev.Type //Tool tips t137=Open Device File t138=Save Device File t139=Print Buffer t140=Reload Files t141=Read Device t142=Read Program Memory (FLASH) t143=Read Data Memory (EEPROM) t144=Read Security and Configuration Bits t145=Write Device t146=Write Program Memory (FLASH) t147=Write Data Memory (EEPROM) // t148=Verify Program Memory (FLASH) t149=Verify Data Memory (EEPROM) t150=Verify Security and Configuration Bits t151=Select device family t152=Select device type t153=Edit device notes //Error Messages t154=Device Not Responding t155=Bad device, select the correct type t156=Device missing or unknown device t157=Unable to probe, bad device or device locked t158=User abort t159=Communication port not available t160=I/O access denied. You must be root to perform I/O t161=Programmer board not found t162=Hardware error, is the board properly connected? t163=Bus busy or hardware error t164=Missing Acknowledge from the device t165=Missing device t166=Timeout on the bus t167=I2CBus Stop condition error (bad timing?) t168=Write error t169=Blank check error t170=Error n. t171=Script error //----Setup dialog //Dialog title t172=I/O port setup t173=Interface board Setup //Dialog messages t174=COM/LPT interface t175=Serial t176=Parallel t177=Interface select t178=Interface type t179=COM Port select t180=COM t183=LPT Port select t184=LPT t185=Select Polarity of the Control lines t186=Invert Reset t187=Invert SCKL t188=Invert D-IN t189=Invert D-OUT //Tool tips t190=Select serial port COM t192=Select parallel port LPT //----Fill dialog //Dialog title t193=Fill Buffer //Dialog messages: NB should be of the same size (number of char) t194=From t195=To t196=Value //----Fuse dialog //Button captions t197=Clear All t198=Set All t199=Write t200=Read //Dialog title t201=Configuration and Security bits //Dialog messages: NB should be of the same size (number of char) t202=First Block to Lock t203=N.of Blocks to Lock t204=High endurance block //Tool tips t205=All bits to '0' t206=All bits to '1' t207=Write bits to the device t208=Read bits from the device //----Info dialog //Button captions t209=Close //Dialog title t210=Device Info //Dialog messages t211=Bank roll-over capability: t212=Size: t213=CRC: t214=Security block: t215=High endurance block: //----Char Edit dialog //Dialog title t216=Edit Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Char t220=Insert the new value t221=Enter text from the address //Tool tips t222=Hexadecimal value t223=Decimal value t224=Char value //----Program Option dialog //Dialog title t225=Program Options //Dialog messages t226=Reload Files t227=Read Program memory (FLASH) t228=Read Data memory (EEPROM) t229=Read Seriial Number t230=Byte Swap t231=Set Serial Number t232=Erase t233=Write Program memory (FLASH) t234=Write Data memory (EEPROM) t235=Write Security and Config bits t236=Verify Security and Config bits //----Serial Number dialog //Dialog title t237=Serial Number Config //Dialog messages: NB should be of the same size (number of char) t238=Address t239=Size t240=Value t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Data memory offset //Tool tips t245=Memory address t246=Size in bytes t247=Next value to be used t248=Assume the Address relative to Data memory instead of Program memory t249=Most significant Byte at high address t250=Most significant Byte at low address //----Retry dialog //Button captions t251=Abort t252=Retry t253=Ignore //Dialog title t254=Alert //----Notes dialog //Dialog title t255=Edit Device Notes //----Progress dialog //Dialog title t256=Status //----Hardware check dialog t257=Hardware Check //----About dialog t258=Disable sound //---- Oscillator Calibration Byte t260=Oscillator Calibration Byte t261=Read Osc.Calibration Byte t262=Osc. Calibration Options... t263=Read Osc.Calibration Byte successful t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed t286=Save the result in the buffer at given location t287=Preferences t288=Be sure the VTarget is on (check J3) and NO target attached for the test tmp9balx013/lang/slovak.utf0000644000175000017500000002053713616566001015675 0ustar carstencarstenLANGUAGE_NAME slovak LANGUAGE_CHARSET UTF-8 t0=slovak t1=Translator Credits: t2=Riean Pavel t3=Seriovy Programator Obvodov t4=Stiahnite si najnovsiu verziu t5=na adrese : t6=Bez Mena //Button captions t7=OK t8=Zrusit t9=Pomoc t10=Skuska t12=Poznamka t13=Edituj //Dialog messages t14=Verzia t15=Ano t16=Nie t17=Ok t18=Test t19=Chyba t20=Info t21=Strana t22=Neznamy t23=Buffer \"%s\"zmeneny. Ulozit ho pred zatvorenim? t24=Buffer zmeneny. Ulozit ho pred otvorenim? t25=Niet co ulozit t26=Niet co nahrat t27=Niet co tlacit t28=Niet co zapisat t29=Niet co kontrolovat t30=Kalibracia casovania zbernice.\nZabezpecte, aby nebezala ina aplikacia ako t31=\n(procesor a harddisk maju byt necinne)\nKalibracia moze trvat par sekund...\nChcete teraz spustit kalibraciu? t32=Kalibracia OK t33=Chybna kalibracia! t34=Musite spustit >Kalibracia< z menu Setup \npred akymikolvek operaciami citanie/zapis t35=Musite spustit Setup programatora z menu Setup \npred akymikolvek operaciami citanie/zapis t36=Citam... t37=Citanie uspesne\nKapacita obvodu: t38=Chcete naozaj obvod zacat programovat?\nVsetky udaje v nom budu prepisane t39=Programujem... t40=Kontrolujem... t41=Programovanie uspesne t42=Programovanie CHYBNE ! t43=Mazem... t44=Mazanie uspesne //t40=Kontrolujem... t45=Nemozno kontrolovat, obvod nebol najdeny alebo je chybny t46=Kontrola CHYBNA ! t47=Kontrola uspesna t48=Programovanie uspesne t49=Programovanie CHYBNE ! t50=Reset Obvodu t51=Zapisujem security bity... t52=Zapis security bitov CHYBNE ! t53=Citam security bity... t54=Citanie configuration bitov CHYBNE ! t55=Citanie configuration bitov... t56=Citanie configuration bitov CHYBNE ! t57=Zapisujem configuration bity... t58=Zapis configuration bitov CHYBNE ! t64=Buffer prazdny t65=Operacia nie je podporovana t66=Vloz parametre t67=Zle parametre t68=Akceptujem prikazy... t69=Otvor subor s datami t72=Subor nenajdeny t73=Chyba pri ukladani suboru t74=Uloz subor s datami ako t75=Uloz Program (FLASH) do suboru ako t76=Uloz Data (EEPROM) do suboru ako t77=Zatvor posledne okno: chcete ukoncit program? t78=Buffer zmeneny. Ulozit ho pred zatvorenim? //Menu entries //Main Menu t80=&Subor t81=&Edituj t82=&Obvody t83=&Prikazy t85=&Utility t86=&Setup t87=&Nastavenia t88=&? //Menu File t89=&Nove Okno t90=&Otvor Datovy Subor... t91=Otvor &Program (FLASH) Subor... t92=Otvor &Data (EEPROM) Subor... t93=&Save Device File t94=Uloz Datovy Subor &Ako... t95=Uloz Program (&FLASH) Subor Ako... t96=Uloz Data (&EEPROM) Subor Ako... t97=&Znovunahratie Suborov t98=Nahra&j... t99=&Zatvor t100=E&xit //Menu Edit t101=Edituj &Typy... t102=Editacia Bu&ffra povolena //Menu Command t103=&Citaj Vsetko t104=Citaj Program (FLASH) t105=Citaj Data (EEPROM) t106=Citaj &Security a Configuration Bity t107=&Napal Vsetko t108=Napal Program (&FLASH) t109=Napal Data (EEPROM) t110=Na&pal Security a Configuration Bity t111=&Skontroluj Vsetko t112=Skontroluj Program (FLASH) t113=Skontroluj Data (EEPROM) t114=Skontrolu&j Security a Configuration Bity t115=&Vymaz t116=&Info t117=Rese&t t118=&Napal t119=Nastavenia... //Menu Options t120=&Setup programatora... t121=&Kalibracia t122=&Dialkovy Rezim //Menu Utility t123=&Vycisti Buffer t124=&Vypln Buffer... t125=&Dvojita Bank t126=&Prehod Byty t127=Nastav Seriove& Cislo t128=Konfig Serioveho C&isla... //Menu Help t129=&Pomocnik t130=&O programe //Menu Options t131=&Log Subor... //Tool Bar //Dialog Messages t136=Typ.Obvodu //Tool tips t137=Otvor Datovy Subor t138=Uloz Datovy Subor t139=Vytlac Buffer t140=Znovunahratie Suborov t141=Citaj Obvod t142=Citaj Program Memory (FLASH) t143=Citaj Data Memory (EEPROM) t144=Citaj Security a Configuration Bity t145=Napal Obvod t146=Napal Program Memory (FLASH) t147=Napal Data Memory (EEPROM) t148=Kontroluj Program Memory (FLASH) t149=Kontroluj Data Memory (EEPROM) t150=Kontroluj Security and Configuration Bity t151=Vyber druh obodu t152=Vyber typ obodu t153=Edituj typ obvodu //Error Messages t154=Obvod Neodpoveda t155=Zly typ obvodu, vyberte spravny t156=Obvod nepripojeny alebo je neznamy t157=Nemozno skusat, chybny alebo zamkuty obvod t158=Prerusene uzivatelom t159=Komunikacny port nedostupny t160=I/O pristup zakazany. Musite byt administrator ! t161=Programator nenajdeny t162=Chyba hardwaru, je programator dobre pripojeny ? t163=Zbernica zatazena alebo chyba hardwaru t164=Ziadna Odozva z Obvodu I2C t165=I2C:Nepripojeny Obvod t166=I2C:Cas komunikacie uplynul t167=I2C:Chyba komunikacie (zle casovanie?) t168=Chyba pri zapise do obvodu t169=Obvod nieje prazdny t170=Chyba c. //----Setup dialog //Dialog title t172=Nastavenie I/O portu t173=Nastavenie programatora //Dialog messages t174=COM/LPT Programator t175=Seriovy t176=Paralelny t177=Druh t178=Typ t179=Vyber COM Portu t180=COM t183=Vyber LPT Portu t184=LPT t185=Vyber Polaritu Kontrolnych Signalov t186=Invertuj Reset t187=Invertuj SCKL t188=Invertuj D-IN t189=Invertuj D-OUT //Tool tips t190=Vyber seriovy port COM t192=Vyber paralelny port LPT //----Fill dialog //Dialog title t193=Vypln Buffer //Dialog messages: NB should be of the same size (number of char) t194=Od adresy t195=Po adresu t196=Hodnotou //----Fuse dialog //Button captions t197=Vymaz Vsetky t198=Nastav Vsetky t199=Napal t200=Citaj //Dialog title t201=Configuration a Security bity //Dialog messages: NB should be of the same size (number of char) t202=Prvy Blok na Uzamknutie t203=Pocet Blokov na Uzamknutie t204=High-endurance blok //Tool tips t205=Vsetky bity do '0' t206=Vsetky bity do '1' t207=Napal bity do obvodu t208=Citaj bity z obvodu //----Info dialog //Button captions t209=Zatvor //Dialog title t210=Info o Obvode //Dialog messages t211=Podpora 'Bank roll-over' : t212=Velkost: t213=CRC: t214=Security blok: t215=High endurance blok: //----Char Edit dialog //Dialog title t216=Editovat Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hexa t218=Dec. t219=Znaky //Tool tips t222=Hexadecimalna hodnota t223=Decimalny hodnota t224=Znakovy udaj //----Program Option dialog //Dialog title t225=Programovacie Moznosti //Dialog messages t226=Znovunahraj Subory t227=Citaj Program memory (FLASH) t228=Citaj Data memory (EEPROM) t229=Citaj Seriove Cislo t230=Prehod Bajty t231=Nastav Seriove Cislo t232=Vymaz t233=Zapis Program memory (FLASH) t234=Zapis Data memory (EEPROM) t235=Zapis Security a Config bity t236=Kontroluj Security a Config bity //----Serial Number dialog //Dialog title t237=Konfig serioveho cisla //Dialog messages: NB should be of the same size (number of char) t238=Adresa t239=Velkost t240=Hodnota t241=Format //next 2 probably can't be translated t242=INTEL t243=MOTOROLA t244=Relativne k Datovej Pamati //Tool tips t245=Adresa v pamati t246=Velkost v bajtoch t247=Hodnota ktora bude pouzita t248=Povoli pouzitie Adresy relativne k Datovej pamati namiesto k Programovej pamati t249=MSB na vyssej adrese - INTEL format t250=MSB na nizsej adrese - MOTOROLA format //----Retry dialog //Button captions t251=Zrusit t252=Opakovat t253=Ignorovat //Dialog title t254=Upozornenie //----Notes dialog //Dialog title t255=Editovat typ obvodu //----Progress dialog //Dialog title t256=Stav //Script t84=Skri&pt t132=&Editovanie... t133=&Nahraj and Spusti... t134=&Nahraj Automaticky t135=&Spusti t59=Chyba v skripte na riadku t60=Zly prikaz t61=Zly argument t62=Chybajuci argument t63=Chces pokracovat? t79=Otvor skript t171=Chyba skriptu t70=Otvor programovy (FLASH) subor t71=Otvor datovy (EEPROM) subor t220=Vloz novu hodnotu t221=Vloz text z pozicie t258=Zrus zvuk //---- Oscillator Calibration Byte t260=Kalibracny Byte Oscilatora t261=Precitaj Kalibracny Byte Osc. t262=Moznosti Kalibracneho Bytu Osc... t263=Precitanie Kalibracneho Bytu Osc. uspesne t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/slovenski.utf0000644000175000017500000002170113616566001016405 0ustar carstencarstenLANGUAGE_NAME slovenski LANGUAGE_CHARSET UTF-8 t0=Slovenski t1=Translator Credits: t2= t3=Programator Serijskih Naprav t4=Zadnjo razlièico t5=snemite na naslovu: t6=No Name //Button captions t7=V redu t8=Preklièi t9=Pomoè t10=Preizkus t12=Opomba t13=Uredi //Dialog messages t14=Razlièica t15=Da t16=Ne t17=V redu t18=Test t19=Ni uspel t20=Vizitka t21=Stran t22=Neznan t23=Vsebina \"%s\"je spremenjena. Ali elite shraniti spremembe pred zapiranjem? t24=Vsebina je spremenjena. Ali elite shraniti spremembe pred odpiranjem? t25=Niè ni za shranit t26=Niè ni za naloit t27=Niè ni za natisnit t28=Niè ni za vpisat t29=Niè ni za preverit t30=Èasovno kalibriranje vodila.\nPreprièajte se, da trenutno ne teèe noben drug program razen t31=\n(CPE in trdi disk morata biti v reimu mirovanja)\nKalibriranje lahko traja nekaj sekund.\nAli elite sedaj zagnati kalibriranje? t32=Kalibriranje uspelo t33=Kalibriranje ni uspelo t34=Pred postopkom Branja/Pisanja morate zagnati\nKalibriranje iz menuja Monosti t35=Pred postopkom Branja/Pisanja morate zagnati\nNastavitve iz menuja Monosti t36=Berem... t37=Branje uspeno\nVelikost Naprave: t38=Ali ste preprièani, da elite pisati v napravo ?\nVsa predhodna vsebina bo izgubljena t39=Vpisujem... t40=Preverjam... t41=Vpis uspeen t42=Vpis neuspeen t43=Briem... t44=Brisanje uspeno //t40=Preverjam... t45=Ne morem preveriti, naprava manjka ali pa je pokvarjena t46=Preverjanje neuspeno t47=Preverjanje uspeno t48=Programiranje uspeno t49=Programiranje neuspeno t50=Naprava resetirana t51=Vpisujem varnostne bite... t52=Vpis varnostnih bitov neuspeen t53=Berem varnostne bite... t54=Branje konfiguracijskih bitov neuspeno t55=Berem konfiguracijske bite... t56=Branje konfiguracijskih bitov neuspeno t57=Vpisujem konfiguracijske bite... t58=Vpisovanje konfiguracijskih bitov neuspeno t64=Prazen pomnilnik t65=Operacija ni podprta t66=Vstavi parametre t67=Slabi parametri t68=Sprejemam ukaze... t69=Odpri datoteko z vsebino naprave t72=Datoteke ni mogoèe najti t73=Ne morem shraniti datoteke t74=Shrani Datoteko z Vsebino Naprave kot t75=Shrani Datoteko s Programom (FLASH) kot t76=Shrani Datoteko s Podatki (EEPROM) kot t77=Zapirate zadnje okno: ali elite konèati? t78=Vsebina pomnilnika je spremenjena. Ali elite shraniti spremembe pred zapiranjem? //Menu entries //Main Menu t80=&Datoteka t81=&Uredi t82=&Naprava t83=U&kaz t85=&Orodja t86=N&astavitve t87=&Monosti t88=&Pomoè //Menu File t89=&Novo Okno t90=&Odpri Datoteko Naprave... t91=Odpri datoteko s &Programom (FLASH) ... t92=Odpri datoteko s &Po&datki (EEPROM) ... t93=&Shrani Datoteko z Vsebino Naprave t94=Shrani Datoteko z Vsebino Naprave &kot... t95=Shrani Datoteko s Programom (&FLASH) kot... t96=Shrani Datoteko s Podatki (&EEPROM) kot... t97=&Ponovno naloi Datoteke t98=Na&tisni... t99=&Zapri t100=Iz&hod //Menu Edit t101=Uredi &Opombo... t102=Urejanje Po&mnilnika omogoèeno //Menu Command t103=&Preberi Vse t104=Beri Program (FLASH) t105=Beri Data (EEPROM) t106=Beri V&arnostne in Konfiguracijske Bite t107=&Vpii Vse t108=Vpii Program (&FLASH) t109=Vpii Podatke (&EEPROM) t110=Vp&ii Varnostne in Konfiguracijske Bite t111=P&reveri Vse t112=Preveri Program (FLASH) t113=Preveri Podatke (EEPROM) t114=Preveri Varnostne in Konfiguracijske Bite t115=&Zbrii t116=Pridobi Po&datke t117=Rese&tiraj t118=&Programiraj t119=Monosti Programiranja... //Menu Options t120=&Nastavitve Vmesnika... t121=&Kalibriranje t122=&Oddaljen reim //Menu Utility t123=&Zbrii Pomnilnik t124=&Napolni Pomnilnik... t125=&Podvoji Banko t126=&Zamenjaj Bajta t127=Doloèi &Serijsko tevilko t128=N&astavitve serijske tevilke... //Menu Help t129=&Vsebina t130=V&izitka //Menu Options t131=&Dnevnik... //Tool Bar //Dialog Messages t136=Tip Naprave //Tool tips t137=Odpri Datoteko Naprave t138=Shrani Datoteko naprave t139=Natisni Vsebino pomnilnika t140=Ponovno naloi Datoteke t141=Beri Napravo t142=Beri Programski Pomnilnik (FLASH) t143=Beri Podatkovni Pomnilnik (EEPROM) t144=Beri Varnostne in Konfiguracijske Bite t145=Pii v Napravo t146=Pii v Programski Pomnilnik (FLASH) t147=Pii v Podatkovni pomnilnik (EEPROM) t148=Preveri Programski pomnilnik (FLASH) t149=Preveri Podatkovni pomnilnik (EEPROM) t150=Preveri Varnostne in Konfiguracijske Bite t151=Izberi druino naprave t152=Izberi tip naprave t153=Uredi opombe naprav //Error Messages t154=Naprava se ne odziva t155=Slaba naprava, izberite pravilen tip t156=Naprava ni prisotna ali pa je tip neznan t157=Ne morem preizkusiti, naprava je slaba ali pa je zaklenjena t158=Prekinitev s strani uporabnika t159=Komunikacijska vrata niso na voljo t160=V/I dostop zavrnjen. Za to operacijo morate biti administrator t161=Ne morem zaznati ploèe programatorja t162=Napaka v aparaturni opremi, ali je ploèa prikljuèena pravilno? t163=Vodilo zasedene ali pa je napaka v aparaturni opremi t164=Manjka Potrditev (Acknowledge) iz naprave t165=Naprava ni prisotna t166=Èas na vodilu je potekel t167=Napaka v I2CBus Stop pogoju (slaba èasovna sinhronizacija?) t168=Napaka pri vpisu t169=Napaka pri vpisu t170=Napaka t. //----Setup dialog //Dialog title t172=Nastavitve V/I vrat t173=Nastavitve vmesnike Ploèe //Dialog messages t174=COM/LPT vrata t175=Serijsko t176=Paralelno t177=Izbira vmesnika t178=Tip vmesnika t179=Izbira COM vrat t180=COM t183=Izbira LPT vrat t184=LPT t185=Izbira Polaritete Kontrolnih linij t186=Invertiraj Reset t187=Invertiraj SCKL t188=Invertiraj D-IN t189=Invertiraj D-OUT //Tool tips t190=Izberi serijska vrata COM t192=Izberi paralelna vrata LPT //----Fill dialog //Dialog title t193=Napolni Pomnilnik //Dialog messages: NB should be of the same size (number of char) t194=Od t195=Do t196=Vrednost //----Fuse dialog //Button captions t197=Zbrii Vse t198=Postavi Vse t199=Pii t200=Beri //Dialog title t201=Konfiguracijski in Varnostni biti //Dialog messages: NB should be of the same size (number of char) t202=Prvi Blok za Zaklep t203=t. Blokov za Zaklep t204=Blok visoke trajnosti //Tool tips t205=Vse bite na '0' t206=Vse bite na '1' t207=Vpii bite v napravo t208=Beri bite iz naprave //----Info dialog //Button captions t209=Zapri //Dialog title t210=Podatki o napravi //Dialog messages t211=Bank roll-over kapaciteta: t212=Velikost: t213=CRC: t214=Varnostni blok: t215=Blok visoke trajnosti: //----Char Edit dialog //Dialog title t216=Uredi Pomnilnik //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Char //Tool tips t222=Heksadecimalna vrednost t223=Decimalna vrednost t224=Znakovna vrednost //----Program Option dialog //Dialog title t225=Monosti Programiranja //Dialog messages t226=Ponovno naloi Datoteke t227=Beri Programski Pomnilnik (FLASH) t228=Beri Podatkovni Pomnilnik (EEPROM) t229=Beri serijsko tevilko t230=Zamenjaj Bajta t231=Doloèi Serijsko tevilko t232=Zbrii t233=Pii v Programski Pomnilnik (FLASH) t234=Pii v Podatkovni Pomnilnik (EEPROM) t235=Vpii Varnostne in Konfiguracijske Bite t236=Preveri Varnostne in Konfiguracijske Bite //----Serial Number dialog //Dialog title t237=Nastavitev Serijske tevilke //Dialog messages: NB should be of the same size (number of char) t238=Naslov t239=Velikost t240=Vrednost t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Odmik Podatkovnega pomnilnika //Tool tips t245=Naslov pomnilnika t246=Velikost v bajtih t247=Naslednja vrednost za uporabo t248=Privzemite, da je Naslov relativen glede na Podatkovni in ne na Programski pomnilnik t249=Najpomembneji Bajt pri visokem naslovu t250=Najpomembneji Bajt pri nizkem naslovu //----Retry dialog //Button captions t251=Prekini t252=Ponovi t253=Prezri //Dialog title t254=Opozori //----Notes dialog //Dialog title t255=Uredi opombe naprav //----Progress dialog //Dialog title t256=Stanje //Script t84=Scri&pt t132=&Edit... t133=&Load and Run... t134=&Auto Load t135=&Run t59=Script error at line t60=Bad command t61=Bad argument t62=Argument missing t63=Do you want to continue? t79=Open script file t171=Script error t70=Open program (FLASH) content file t71=Open data (EEPROM) content file t220=Insert the new value t221=Enter text from location t258=Disable sound //---- Oscillator Calibration Byte t260=Oscillator Calibration Byte t261=Read Osc.Calibration Byte t262=Osc. Calibration Options... t263=Read Osc.Calibration Byte successful t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/brazilian.utf0000644000175000017500000002301213616566001016340 0ustar carstencarstenLANGUAGE_NAME brazilian LANGUAGE_CHARSET UTF-8 t0=brazilian t1=Traduzido por: t2=Daniel Jos Viana t3=Programador Serial de Dispositivos t4=Baixe a última versão do t5=no endereço: t6=Sem Nome //Button captions t7=OK t8=Cancelar t9=Ajuda t10=Identificar t12=Nota t13=Editar //Dialog messages t14=Versão t15=Sim t16=Não t17=Ok t18=Testar t19=Falhou t20=Sobre t21=Página t22=Desconhecido t23=O Buffer \"%s\"foi modificado. Salvar antes de Fechar? t24=O Buffer foi modificado. Salvar antes de Abrir? t25=Nada para Salvar t26=Nada para carregar t27=Nada para imprimir t28=Nada para gravar t29=Nada para verificar t30=Calibração de velocidade do barramento.\nAssegure-se de que nenhum outro programa esteja rodando t31=\n(A CPU e o HD devem estar sem atividade\nA calibração pode demorar alguns segundos.\nDeseja executar a calibração agora? t32=Calibrado t33=Falha na Calibração t34=É necessário calibrar o sitema (item Calibração no menu de Opções)\nantes de qualquer operação de leitura/escrita t35=É necessário configurar o sistema (item Confogurar no menu de Opções)\nantes de qualquer operação de leitura/escrita t36=Lendo... t37=Leitura OK\nTamanho do dispositivo: t38=Tem certeza de que quer gravar o dispositivo?\nTodo o conteúdo anterior será perdido t39=Gravando... t40=Verificando... t41=Gravação OK t42=Falha na gravação t43=Apagando... t44=Apagado corretamente //t40=Verificando... t45=Não é possível verificar, dispositivo não inserido ou com problemas t46=Falha na verificação t47=Verificação OK t48=Programado corretamente t49=Fallha na programação t50=Dispositivo reiniciado t51=Escrevendo bits de segurança... t52=Falha na escrita do bits de segurança t53=Lendo bits de segurança t54=Falha na leitura dos bits de configuração t55=Lendo bits de configuração t56=Falha na lectura dos bits de configuração t57=Escrevendo bits de configuração t58=Falha na escrita do bits de configuração t64=Buffer vazio t65=Operação não implementada t66=Entre com os parâmetros t67=Parâmetros incorretos t68=Aceitando comandos... t69=Abrir arquivo com o conteúdo do dispositivo t72=Arquivo não encontrado t73=Falha na gravação do arquivo t74=Salvar conteúdo do dispositivo em arquivo como t75=Salvar Programa (FLASH) em arquivo como t76=Guardar Dados (EEPROM) em arquivo como t77=A última janela foi encerrada. Deseja sair do programa? t78=Buffer modificado. Salvar antes de sair? //Menu entries //Main Menu t80=&Arquivo t81=&Editar t82=&Dispositivo t83=&Comando t85=&Utilitário t86=Con&figuração t87=&Opções t88=A&juda //Menu File t89=&Nova Janela t90=&Abrir arquivo de dispositivo... t91=Abrir arquivo de &Programa (FLASH)... t92=Abrir arquivo de &Dados (EEPROM)... t93=&Salvar arquivo de dispositivo t94=Salvar arquivo de dispositivo &como... t95=Salvar arquivo de Programa (&FLASH) como... t96=Salvar arquivo de Datos (&EEPROM) como... t97=&Recarregar arquivos t98=&Imprimir... t99=Fechar t100=Sair //Menu Edit t101=Editar &Nota... t102=Permitir edição do bu&ffer //Menu Command t103=&Ler tudo t104=Ler Programa (FLASH) t105=Ler Dados (EEPROM) t106=Ler &Bits de Segurança e Configuração t107=&Gravar Tudo t108=Gravar Programa (&FLASH) t109=Gravar Dados (EEPROM) t110=Gravar Bits de Segurança e Configuração t111=&Verificar tudo t112=Verificar Programa (FLASH) t113=Verificar Datos (EEPROM) t114=Verific&ar Bits de segurança e Configuração t115=&Apagar t116=&Obter Informação t117=Rese&t t118=&Programar t119=Opções de Programação... //Menu Options t120=Conf&iguração da Interface... t121=Calibração t122=Modo &Remoto //Menu Utility t123=&Limpar Buffer t124=&Encher Buffer... t125=&Duplo Banco t126=Alternar (Swap) &Bytes t127=Definir &Número de Série t128=C&onfiguração de Número de Série... //Menu Help t129=A&juda t130=S&obre... //Menu Options t131=arquivo &Log... //Tool Bar //Dialog Messages t136=Tipo Disp. //Tool tips t137=Abrir Arquivo de Dispositivo t138=Salvar Arquivo de Dispositivo t139=Imprimir Buffer t140=Reabrir arquivos t141=Ler Dispositivo t142=Ler Memória de Programa (FLASH) t143=Ler Memória de Dados (EEPROM) t144=Ler Bits de Segurança e Configuração t145=Gravar Dispositivo t146=Gravar Memória de Programa (FLASH) t147=Gravar Memória de Dados (EEPROM) t148=Verificar Memória de Programa (FLASH) t149=Verificar Memória de Dados (EEPROM) t150=Verificar Bits de Segurança e Configuração t151=Selecionar família do dispositivo t152=Selecionar tipo do dispositivo t153=Editar notas do dispositivo //Error Messages t154=O dispositivo não responde t155=Dispositivo errado, selecione o tipo correto t156=Dispositivo não inserido ou desconhecido t157=Não é possível Identificar, dispositivo com problemas ou protegido (locked) t158=Cancelado pelo Usuário t159=Porta Serial não disponível t160=Acesso de I/O negado. É necessário logar como 'root' para acessar recursos de I/O t161=Interface de programação não encontrada t162=Erro de Hardware error, verifique as conexões da interface t163=Barramento ocupado ou erro de Hardware t164=No foi recibido o Acknowledge do dispositivo t165=Dispositivo não encontrado t166='Timeout' de barramento t167=Erro de Condição de Parada (Bus Stop) no barramento I2C (Temporização incorreta?) t168=Erro de Gravação t169=Erro de Apagamento (Blanking) t170=Erro n. //----Setup dialog //Dialog title t172=Configuração da Porta de I/O t173=Configuração da placa de Interface //Dialog messages t174=interface COM/LPT t175=Serial t176=Paralela t177=Selecção da Interface t178=Tipo da interface t179=Seleção da Porta Serial (COM Port) t180=COM t183=Seleção da Porta Paralela (LPT Port) t184=LPT t185=Selecionar Polaridade das linhas de controle t186=Inverter Reset t187=Inverter SCKL t188=Inverter D-IN t189=Inverter D-OUT //Tool tips t190=Selecionar porta serial COM t192=Selecionar porta paralela LPT //----Fill dialog //Dialog title t193=Encher Buffer //Dialog messages: NB should be of the same size (number of char) t194=De t195=até t196=Valor //----Fuse dialog //Button captions t197=Limpar Todo t198=Marcar Todo t199=Escrever t200=Ler //Dialog title t201=Bits de Configuração e Segurança //Dialog messages: NB should be of the same size (number of char) t202=Prim bloco a travar t203=No. blocos a travar t204=Bl alta resistência //Tool tips t205=Todos bits ='0' t206=Todos bits ='1' t207=Gravar bits no disposit. t208=Ler bits do dispositivo //----Info dialog //Button captions t209=Fechar //Dialog title t210=Informação Dispositivo //Dialog messages t211=Capacidade 'Bank roll-over': t212=Tamaho: t213=CRC: t214=Bloco de segurança: t215=Bloco de alta resistência: //----Char Edit dialog //Dialog title t216=Editar Buffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Caracter //Tool tips t222=Valor Hexadecimal t223=Valor Decimal t224=Valor Caracter //----Program Option dialog //Dialog title t225=Opções de Programa //Dialog messages t226=Reabrir arquivos t227=Ler Memória de Programa (FLASH) t228=Ler Memória de Dados (EEPROM) t229=Ler Número de Série t230=Alternar (Swap) Bytes t231=Definir Número de Serie t232=Apagar t233=Escrever Memória de Programa (FLASH) t234=Escrever Memória de Dados (EEPROM) t235=Escrever Bits de Segurança e Configuração t236=Verificar Bits de Segurança e Configuração //----Serial Number dialog //Dialog title t237=Configurar Número de Série //Dialog messages: NB should be of the same size (number of char) t238=Endereço t239=Tamanho t240=Valor t241=Formato //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Offset da Memória de Dados //Tool tips t245=Endereço de Memória t246=Tamanho em bytes t247=Próximo valor a usar t248=considerar o endereço relativo à Memória de Dados ao invés da Memória de Programa t249=Byte mais significativo no endereço maior t250=Byte mais significativo no endereço menor //----Retry dialog //Button captions t251=Parar t252=Insistir t253=Ignorar //Dialog title t254=Alerta //----Notes dialog //Dialog title t255=Editar Notas de Dispositivo //----Progress dialog //Dialog title t256=Status //Script t84=Scri&pt t132=&Editar... t133=Abrir e E&xecutar... t134=&Auto Carregar t135=&Executar t59=Erro no Script. Linha t60=Commando ilegal t61=Argumento ilegal t62=Falta argumento t63=Deseja continuar? t79=Abrir arquivo de script t171=Erro no Script t70=Abrir arquivo com Programa (FLASH) t71=Abrir arquivo com Dados (EEPROM) t220=Entre com o novo valor t221=Entrar texto da posição t258=Desabilitar som //---- Oscillator Calibration Byte t260=Byte de Calibração do Oscilador t261=Ler Byte de Calib. do Oscilador t262=Opções de Calib. do Oscilador t263=Leitura do Byte de Calibração OK t264=Ident. do Chip t265=Nota t266=Tamanho da EEPROM t267=Tamanho da FLASH t268=Incremento Automático t269=Incrementa automaticamente o número de série a partir da última alteração neste t270=Não é possível saber o 'Bank roll-over' sem que se altere os dados e se grave, você quer realmente gravar? t271=O Buffer foi modificado. Deseja salvar antes de realizar a leitura? t272=Abre arquivo de programa (FLASH) t273=Abre arquivo de dados (EEPROM) t274=Salva programa(FLASH) em arquivo t275=Salva memória(EEPROM) em arquvo t276=Nova Janela t277=Recarrega último programa t278=Executa script t279=Configura Interface t280=Apaga dispositivo t281=&Bits de Configuração e Segurança t282=Bits de Configuração e Segurança //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/deutsch.utf0000644000175000017500000002177013616566001016035 0ustar carstencarstenLANGUAGE_NAME deutsch LANGUAGE_CHARSET UTF-8 t0=Deutsch t1=Translator Credits: t2=Thilo Lauer t3=Serieller Device-Programmierer t4=Laden Sie die aktuelle Version von t5=unter der Adresse: t6=Kein Name //Button captions t7=OK t8=Abbruch t9=Hilfe t10=Test t12=Bemerkung t13=Bearbeiten //Dialog messages t14=Version t15=Ja t16=Nein t17=Ok t18=Test t19=Fehler t20=Über t21=Seite t22=Unbekannt t23=Puffer \"%s\"geändert. Speichern vor dem Beenden? t24=Puffer geändert. Speichern vor dem Beenden? t25=Nichts zu speichern t26=Nichts zu laden t27=Nichts zu drucken t28=Nichts zu schreiben t29=Nichts zu vergleichen t30=Bus-Timing-Kalibrierung. \nStellen Sie sicher, dass keine Anwendung läuft, außer t31=\n(CPU und Festplatte sollten im Leerlauf sein)\nDie Kalibrierung kann einige Sekunden dauern.\nWollen Sie die Kalibrierung jetzt starten? t32=Kalibrierung OK t33=Kalibrierung fehlgeschlagen t34=Sie müssen Kalibrieren im Optionen-Menü ausführen\nbevor Sie irgendwelche Lese/Schreib-Vorgänge starten t35=Sie müssen Setup im Optionen-Menü ausführen\nbevor Sie irgendwelche Lese/Schreib-Vorgänge starten t36=Lesen... t37=Lesen erfolgreich\nDevice-Größe: t38=Sind Sie sicher, das Device beschreiben zu wollen?\nJeglicher Inhalt geht verloren t39=Schreiben... t40=Vergleichen... t41=Schreiben erfolgreich t42=Schreiben fehlgeschlagen t43=Löschen... t44=Löschen erfolgreich //t40=Vergleichen... t45=Kein vergleichen möglich, falsches oder fehlendes Device t46=Vergleichen fehlgeschlagen t47=Vergleichen erfolgreich t48=Programmierung erfolgreich t49=Programmierung fehlgeschlagen t50=Device zurückgesetzt t51=Schreibe Security Bits... t52=Schreiben der Security Bits fehlgeschlagen t53=Lese Security Bits... t54=Lesen der Konfigurationsbits fehlgeschlagen t55=Lese Konfigurationsbits... t56=Lesen der Konfigurationsbits fehlgeschlagen t57=Schreibe Konfigurationsbits... t58=Schreiben der Konfigurationsbits fehlgeschlagen t64=Puffer leer t65=Aktion nicht unterstützt t66=Parameter einfügen t67=Falsche Parameter t68=Befehl akzeptiert... t69=Datei mit Device-Inhalt öffnen t72=Datei nicht gefunden t73=Datei sichern fehlgeschlagen t74=Datei speichern unter t75=Speichere Programm (FLASH) Inhalt unter t76=Speichere Data (EEPROM) Inhalt unter t77=Fenster schließen: Wollen sie beenden? t78=Puffer geändert. Speichern vor dem Beenden? //Menu entries //Main Menu t80=&Datei t81=&Bearbeiten t82=&Device t83=&Befehl t85=&Tools t86=&Setup t87=&Optionen t88=&? //Menu File t89=&Neues Fenster t90=&Öffne Device Datei... t91=Öffne &Programm (FLASH) Datei... t92=Öffne &Daten (EEPROM) Datei... t93=&Speichere Device Datei t94=Speichere Device Datei &unter... t95=Speichere Programm (&FLASH) Datei unter... t96=Speichere Daten (&EEPROM) Datei unter... t97=&Dateien wiederherstellen t98=Drucken... t99=&Schließen t100=&Beenden //Menu Edit t101=Edit &Note... t102=Edit Bu&ffer eingeschaltet //Menu Command t103=&Lese alles t104=Lese Program (FLASH) t105=Lese Data (EEPROM) t106=Lese &Security und Konfigurationsbits t107=&Schreibe alles t108=Schreibe Program (&FLASH) t109=Schreibe Data (EEPROM) t110=Schre&ibe Security and Konfigurationsbits t111=&Vergleiche alles t112=Vergleiche Program (FLASH) t113=Vergleiche Data (EEPROM) t114=Vergleiche Security and Konfigurationsbits t115=&Löschen t116=&Info holen t117=Rese&t t118=&Programm t119=Programm Optionen... //Menu Options t120=&Hardware Setup... t121=&Kalibrierung t122=&Fernbedienungs-Modus //Menu Utility t123=&Lösche Puffer t124=&Fülle Puffer... t125=&Double Bank t126=&Byte Tausch t127=Setze Serien&nummer t128=Seriennummer konfigurieren... //Menu Help t129=&Hilfe t130=&Über //Menu Options t131=&Log Datei... //Tool Bar //Dialog Messages t136=Dev.Type //Tool tips t137=Öffne Device Datei t138=Speichere Device Datei t139=Drucke Puffer t140=Dateien wiederherstellen t141=Lese Device t142=Lese Programmspeicher (FLASH) t143=Lese Data Speicher (EEPROM) t144=Lese Security und Konfigurationsbits t145=Schreibe Device t146=Schreibe Programmspeicher (FLASH) t147=Schreibe Datenspeicher (EEPROM) t148=Vergleiche Programmspeicher (FLASH) t149=Vergleiche Datenspeicher (EEPROM) t150=Vergleiche Security und Konfigurationsbits t151=Wähle Device-Familie t152=Wähle Device-Typ t153=Bearbeite Device-Beschreibung //Error Messages t154=Device antwortet nicht t155=Falsches Device, bitte den richtigen Typ wählen t156=Falsches oder fehlendes Device t157=Kein Zugriff, Device defekt oder gesperrt t158=Abbruch durch Benutzer t159=Kommunikationsport nicht verfügbar t160=I/O-Zugriff verweigert. Administrator-Rechte erforderlich t161=Programmer nicht gefunden t162=Hardware-Fehler, richtig angeschlossen? t163=Bus-Leitung besetzt oder Hardware-Fehler t164=Fehlende Bestätigung vom Device t165=Fehlendes Device t166=Zeitüberschreitung der Bus-Leitung t167=I2CBus Stop Fehler (falsches Timing?) t168=Fehler beim schreiben t169=Fehler beim Leertest t170=unbekannter Fehler //----Setup dialog //Dialog title t172=I/O-Port-Setup t173=Hardware Setup //Dialog messages t174=COM/LPT Hardware t175=Seriell t176=Parallel t177=Hardware-Auswahl t178=Hardware-Typ t179=COM-Port-Auswahl t180=COM t183=LPT-Port-Auswahl t184=LPT t185=Polaritätswahl der Kontroll-Leitungen t186=Invertiere Reset t187=Invertiere SCKL t188=Invertiere D-IN t189=Invertiere D-OUT //Tool tips t190=Wähle Seriellen Port COM t192=Wähle Parallelen Port LPT //----Fill dialog //Dialog title t193=Fülle Puffer //Dialog messages: NB should be of the same size (number of char) t194=Von t195=Bis t196=Wert //----Fuse dialog //Button captions t197=Lösche alle t198=Setze alle t199=Schreiben t200=Lesen //Dialog title t201=Security und Konfigurationsbits //Dialog messages: NB should be of the same size (number of char) t202=Erster zu sperrender Block t203=Nr. der zu sperrenden Blöcke t204=High endurance block //Tool tips t205=Alle Bits auf '0' t206=Alle Bits auf '1' t207=Schreibe Bits in Device t208=Lese Bits aus Device //----Info dialog //Button captions t209=Schließen //Dialog title t210=Device Information //Dialog messages t211=Fähigkeit zu Bank roll-over: t212=Größe: t213=CRC: t214=Security Block: t215=High endurance block: //----Char Edit dialog //Dialog title t216=Editiere Puffer //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Dezimal t219=Ascii //Tool tips t222=Hexadezimal-Wert t223=Dezimal-Wert t224=ASCII-Wert //----Program Option dialog //Dialog title t225=Programm-Optionen //Dialog messages t226=Dateien wiederherstellen t227=Lese Programmspeicher (FLASH) t228=Lese Datenspeicher (EEPROM) t229=Lese Seriennummer t230=Byte-Tausch t231=Setze Seriennummer t232=Löschen t233=Schreibe Programmspeicher (FLASH) t234=Schreibe Datenspeicher (EEPROM) t235=Schreibe Security- und Konfigurationsbits t236=Vergleiche Security- und Konfigurationsbits //----Serial Number dialog //Dialog title t237=Seriennummer-Konfiguration //Dialog messages: NB should be of the same size (number of char) t238=Addresse t239=Größe t240=Wert t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Datenspeicher-Offset //Tool tips t245=Speicher-Addressen t246=Größe in Bytes t247=Nächster benutzter Wert t248=Verwenden Sie die Addresse relativ zum Datenspeicher anstelle des Programmspeichers t249=Höherwertiges Byte an hohe Adresse t250=Höherwertiges Byte an niedrige Adresse //----Retry dialog //Button captions t251=Abbruch t252=Wiederholen t253=Ignorieren //Dialog title t254=Alarm //----Notes dialog //Dialog title t255=Editiere Device-Beschreibung //----Progress dialog //Dialog title t256=Status //Script t84=Scri&pt t132=&Editieren... t133=&Laden und Ausführen... t134=A&utomatisch ausführen t135=&Ausführen t59=Script-Fehler in Zeile t60=Falsches Kommando t61=Falsches Argument t62=Fehlendes Argument t63=Wollen Sie weiterarbeiten? t79=Script-Datei öffnen t171=Script-Fehler t70=Öffne Programmspeicher-Datei (FLASH) t71=Öffne Datenspeicher-Datei (EEPROM) t220=Geben Sie den neuen Wert ein t221=Geben Sie den neuen Text ein t258=Sound deaktivieren //---- Oscillator Calibration Byte t260=Kalibrierungsbyte für Oszillator t261=Lese Kalibrierungsbyte für Oszillator t262=Optionen für Oszillator-Kalibrierung... t263=Lesen des Kalibrierungsbytes für Oszillator erfolgreich t264=Chip-Kennung t265=Bemerkung t266=EEPROM-Größe t267=FLASH-Größe t268=Autoinkrementalmodus t269=Erhöhe die Seriennummer nach jeder 'Setze Seriennummer'-Operation t270=EEPROM Bank Roll-over-Test erfordert Schreibzugriff. Zugriff durchführen? t271=Buffer wurde modifiziert. Vor dem Lesen sichern? t272=Programmdatei öffnen (FLASH) t273=Datendatei öffnen (EEPROM) t274=Programmdatei speichern (FLASH) t275=Datendatei speichern (EEPROM) t276=Neues Fenster t277=Programmierung starten t278=Script ausführen t279=Setup-Dialog öffnen t280=Komplettes Device mit FF löschen t281=Sicherheit- und Konfigurations&bits... t282=Sicherheit- und Konfigurationsbits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Bitte mit Datenblatt vergleichen t284=markierte Kästchen bedeuten Programmiert t285=leere Kästchen bedeuten Unprogrammiert tmp9balx013/lang/polish.utf0000644000175000017500000002312113616566001015664 0ustar carstencarstenLANGUAGE_NAME polish LANGUAGE_CHARSET UTF-8 t0=Polski //Fill this with your reference, if it's empty""it will be invisible t1=Kredyty translatorów: t2=Rafal Gisko & poprawione przez MopIC'a t3=Programator szeregowy t4=sci¹gnij najnowsz¹ wersjê t5=spod adresu: t6=bez nazwy //Button captions t7=OK t8=Anuluj t9=Pomoc t10=Próba t11=Test sprzêtowy t12=Nota t13=Edycja //Dialog messages t14=Wersja t15=Tak t16=Nie t17=Ok t18=Test t19=B³¹d t20=O t21=Strona t22=Nieznany t23=Bufor \"%s\"siê zmieni³. Zapisaæ przed zamkniêciem? t24=Bufor siê zmieni³. Zapisaæ go przed otwarciem? t25=Nie ma nic do zachowania t26=Nie ma nic do za³adowania t27=Nie ma nic do drukowania t28=Nie ma nic do zapisu t29=Nie ma nic do weryfikacji t30=Kalibracja prêdkoœci zegara.\nUpewnij siê, ¿e ¿aden inny program nie pracuje na tym komputerze t31=\n(CPU oraz dysk twardy musz¹ byæ bezczynne)\nKalibracja zabierze trochê czasu.\nCzy chcesz teraz uruchomiæ kalibracjê? t32=Kalibracja OK t33=B³¹d podczas kalibracji t34=Musisz uruchomiæ Kalibracjê z menu Opcje\nprzed jak¹kolwiek operacj¹ zapisu lub odczytu t35=Musisz uruchomiæ Ustawienia z menu Opcje\nprzed jak¹kolwiek operacj¹ zapisu lub odczytu t36=Odczyt... t37=Odczyt zakoñczy³ siê sukcesem\nPojemnoœæ uk³adu: t38=Czy na pewno chcesz zapisaæ do uk³adu?\nWszystkie poprzednie dane zostan¹ utracone! t39=Zapis... t40=Weryfikacja... t41=Zapis zakoñcz³ siê pomyœlnie t42=Wyst¹pi³ b³¹d zapisu t43=Kasowanie... t44=Kasowanie zakoñczy³o siê pomyœlnie t45=Nie mo¿na weryfikowaæ, brak sterownika lub jest uskodzone t46=Wystapi³ b³¹d weryfikacji t47=Weryfikacja zakoñczy³a siê sukcesem t48=Programowanie zakoñczy³o siê pomyœlnie t49=Wyst¹pi³ b³ad programowania t50=Reset sterownika t51=Zapis bitów ochronnych... t52=Wyst¹pi³ b³¹d zapisu bitów ochronnych t53=Odczyt bitów ochronnych... t54=Wyst¹pi³ b³¹d odczytu bitów ochronnych t55=Odczyt bitów konfiguracyjnych... t56=Wyst¹pi³ b³¹d odczytu bitów konfiguracyjnych t57=Zapis bitów konfiguracyjnych... t58=Wyst¹pi³ b³¹d zapisu bitów konfiguracyjnych t59=B³ad skryptu w lini t60=Z³a instrukcja t61=Z³y argument t62=Brakuje argumentu t63=Czy chcesz kontynuowaæ? t64=Bufor jest pusty t65=Operacja nie jest dostêpna t66=WprowadŸ parametry t67=Z³e parametry t68=Akceptowanie instrukcji... t69=Otwórz uk³ad zawarty w pliku t70=Otwórz program (FLASH) zawarty w pliku t71=Otwórz dane (EEPROM) zawarte w pliku t72=Pliku nie znaleziono t73=B³¹d zapisu pliku t74=Zachowaj zawartoœæ uk³adu w pliku jako t75=Zachowaj program (FLASH) w pliku jako t76=Zachowaj dane (EEPROM) w pliku jako t77=Zamkniêto ostatnie okno: Czy chcesz zakoñczyæ pracê? t78=Bufor siê zmieni³. Zachowaæ go przed zamkniêciem? t79=Otwórz plik skryptu //Menu entries //Main Menu t80=&Plik t81=&Edycja t82=&Uk³ady t83=Pol&ecenie t84=Skry&pt t85=&Narzêdzia t86=U&stawienia t87=&Opcje t88=&? //Menu File t89=&Nowe okno t90=&Otwórz plik uk³adu... t91=Otwórz &plik (FLASH) programu... t92=Otwórz plik (EEPROM) &danych... t93=&Zachowaj plik u³adu t94=Zachowaj plik uk³adu &jako... t95=Zachowaj program(&FLASH) w pliku jako... t96=Zachowaj dane (&EEPROM) w pliku jako... t97=Z&a³aduj ponownie pliki t98=Dru&kuj... t99=&Zamknij t100=W&yjdŸ z programu //Menu Edit t101=Edytuj &Notatkê... t102=Bu&for edycji w³¹czony //Menu Command t103=&Odczyt wszystkiego t104=Odczyt programu (FLASH) t105=Odczyt danych (EEPROM) t106=Odczyt &bitów ochronnych i konfiguracyjnych t107=&Zapisz wszystko t108=Zapisz program (&FLASH) t109=Zapisz dane (EEPROM) t110=Zap&is bitów ochronnych i konfiguracyjnych t111=&Weryfikuj wszystko t112=Weryfikacja programu (FLASH) t113=Weryfikacja danych (EEPROM) t114=Weryf&ikacja bitów ochronnych i konfiguracyjnych t115=&Kasuj t116=&Informacje t117=Rese&t t118=&Programuj t119=Opcje programowania... //Menu Options t120=&Ustawienia interfejsu... t121=&Kalibracja t122=&Tryb zdalny //Menu Utility t123=&Czyœæ bufor t124=&Wype³nij bufor... t125=&Podwojny bank t126=&Zamieñ bajty t127=Ustaw numer&seryjny t128=Konfigurac&ja numeru seryjnego... //Menu Help t129=&Pomoc t130=&O programie //Menu Options t131=P&lik log... //Menu Script t132=&Edycja... t133=&Za³aduj i uruchom... t134=Z&a³aduj automatycznie t135=U&ruchom //Tool Bar //Dialog Messages t136=Typ uk³. //Tool tips t137=Otwórz plik uk³adu t138=Zachowaj plik uk³adu t139=Drukuj bufor t140=Za³aduj ponownie pliki t141=Odczyt z uk³adu t142=Odczyt zawartoœæ pamiêci (FLASH) t143=Odczyt zawartoœæ pamiêci (EEPROM) t144=Odczyt bitów konfiguracyjnych i ochronnych t145=Zapis do uk³adu t146=Zapis programu w pamiêci (FLASH) t147=Zapis danych w pamiêci (EEPROM) t148=Weryfikacja programu w pamiêci (FLASH) t149=Weryfikacja danych w pamiêci (EEPROM) t150=Weryfikacja bitów ochronnych i konfiguracyjnych t151=Wybór rodziny uk³adów t152=Wybór typu uk³adu t153=Edycja noty o uk³adzie //Error Messages t154=Uk³ad nie odpowiada t155=Z³y uk³ad, wybierz poprawny jego typ t156=Brakuje uk³adu lub nieznany typ t157=Nie mo¿na próbowaæ, z³y uk³ad lub jest zablokowany t158=Przerwane przez u¿ytkownika t159=Port komunikacyjny nie jest dostêpny t160=Komunikacja I/O jest niedostêpna. Musisz byæ zalogowany jako root aby korzystaæ z operacji I/O t161=Nie wykryto programatora t162=B³¹d sprzêtowy, czy programator zosta³ prawid³owo pod³¹czony? t163=Zajête linie lub b³¹d sprzêtowy t164=Brak sygna³u potwierdzenia z uk³adu t165=Brakuje uzr¹dzenia t166=Przekroczono czas na lini t167=B³¹d na lini I2CBus (z³e taktowanie?) t168=B³ad zapisu t169=B³¹d podczas sprawdzania czystoci t170=B³¹d n. t171=B³¹d skryptu //----Setup dialog //Dialog title t172=Ustawienia portu I/O t173=Panel ustawienia interfejsu //Dialog messages t174=COM/LPT interfejs t175=Szeregowy t176=Równoleg³y t177=Wybór interfejsu t178=Typ interfejsu t179=Wybór portu COM t180=COM t183=Wybór portu LPT t184=LPT t185=Select Polarity of the Control lines t186=Zaneguj Reset t187=Zaneguj SCKL t188=Zaneguj D-IN t189=Zaneguj D-OUT //Tool tips t190=Wybierz port szeregowy COM t192=Wybierz port równoleg³y LPT //----Fill dialog //Dialog title t193=Wype³nij bufor //Dialog messages: NB should be of the same size (number of char) t194=Od t195=Do t196=Wartoæ //----Fuse dialog //Button captions t197=Wyczyœæ wszystko t198=Ustaw wszystko t199=Zapis t200=Odczyt //Dialog title t201=Konfiguracja i bity ochronne //Dialog messages: NB should be of the same size (number of char) t202=Pierwszy blok do zablokowania t203=Numer bloku do zablokowania t204=Najwy¿szy blok do zablokowania //Tool tips t205=Wszystkie bity na '0' t206=Wszystkie bity na '1' t207=Zapis bitów do uk³adu t208=Odczyt bitów z uk³adu //----Info dialog //Button captions t209=Zamknij //Dialog title t210=Informacje o uk³adzie //Dialog messages t211=Mo¿liwoœæ banku pamiêci: t212=Rozmiar: t213=CRC: t214=Zabezpieczone bloki: t215=Najwy¿szy zabezpieczony blok: //----Char Edit dialog //Dialog title t216=Edycja buforu //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Dec t219=Znak t220=WprowadŸ now¹ wartoœæ t221=WprowadŸ tekst od adresu //Tool tips t222=Wartoœæ HEX t223=Wartoœæ DEC t224=Wartoœæ znakowa //----Program Option dialog //Dialog title t225=Opcje programowania //Dialog messages t226=Za³aduj ponownie pliki t227=Odczyt danych z pamiêci (FLASH) t228=Odczyt zawartoœci pamiêci (EEPROM) t229=Odczyt numeru seryjnego t230=Zamieñ bajt t231=Ustaw numer seryjny t232=Kasuj t233=Zapis danych do pamiêci (FLASH) t234=Zapis danych do pamiêci (EEPROM) t235=Zapis bitów ochronnych i konfiguracyjnych t236=Weryfikacja bitów ochronnych i konfiguracyjnych //----Serial Number dialog //Dialog title t237=Konfiguracja numeru seryjnego //Dialog messages: NB should be of the same size (number of char) t238=Adres t239=Rozmiar t240=Wartoœæ t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Przesuniêcie w pamieci danych //Tool tips t245=Adres pamiêci t246=Rozmiar w bajtach t247=Nastêpna wartoœæ zostanie u¿yta t248=Pobierz adres wzglêdny do pamiêci danych zamiast pamiêci programu t249=Bardziej znacz¹cy bajt na starszej czêœci adresowej t250=Bardziej znacz¹cy bajt na m³odszej czêœci adresowej //----Retry dialog //Button captions t251=Anuluj t252=Powtórz t253=Ignoruj //Dialog title t254=Alarm //----Notes dialog //Dialog title t255=Edycja noty o uk³adzie //----Progress dialog //Dialog title t256=Status //----Hardware check dialog t257=Test sprzêtowy //----About dialog t258=DŸwiêk wy³¹czony //---- Oscillator Calibration Byte t260=Bajt kalibracyjny oscylatora t261=Odczyt bajtu kalibracji oscylatora t262=Opcje kalibracji oscylatora... t263=Odczyt bajtu kalibracji oscylatora udany t264=Chip Id t265=Nota t266=Rozmiar EEPROM'u t267=Rozmiar FLASH'a t268=Auto Inkrementacja t269=Zwiêksz wartoœæ numeru seryjnego po ka¿dej operacji 'Ustaw numer seryjny' t270=Nie mo¿na rozpoznaæ przewiniêcia banku pamiêci bez modyfikacji i zapisu, czy chcesz zapisaæ? t271=Bufor siê zmieni³. Zachowaæ go przed odczytem? t272=Otwórz plik pamiêci programu (FLASH) t273=Otwórz plik pamiêci danych (EEPROM) t274=Zapisz plik pamiêci programu (FLASH) t275=Zapisz plik pamiêci danych (EEPROM) t276=Nowe okno t277=Rozpocznij cykl programowania t278=Wykonaj skrypt t279=Otwórz okno ustawieñ t280=Wyma¿ ca³y uk³ad z FF t281=&Bity zabezpieczeñ i konfiguracji... t282=Bity zabezpieczeñ i konfiguracji //These strings are added to the 'Configuration and security bits' dialog to explain t283=Zajrzyj do dokumentacji technicznej uk³adu t284=Zaznaczona pozycja oznacza zaprogramowany bit t285=Odznaczona pozycja oznacza bit niezaprogramowany tmp9balx013/lang/japanese.utf0000644000175000017500000002660113616566001016162 0ustar carstencarstenLANGUAGE_NAME japanese LANGUAGE_CHARSET UTF-8 t0=japanese //Fill this with your reference, if it's empty""it will be invisible t1=Translator Credits: t2=Shouji Hirata(shouji@microft.co.jp) t3=シリアルデバイスプログラマー t4=最新バージョン t5=ここから: t6=未定義 //Button captions t7=OK t8=Cancel t9=Help t10=Probe t11=ハードウエアチェック t12=注 t13=編集 //Dialog messages t14=Version t15=Yes t16=No t17=Ok t18=テスト t19=失敗 t20=About t21=Page t22=未定義 t23=バッファー \"%s\"の内容が変更されています。終了前にセーブしますか? t24=バッファーが変更されています。オープンする前にセーブしますか? t25=セーブすべき物がありません t26=ロードするものがありません t27=印刷するものがありません t28=書き込みデータがありません t29=ベリファイデータがありません t30=バスタイミングを調整します\n他のアプリケーションを走らせないでください t31=\n(CPUとハードディスクはアイドル状態に保ってください)\n調整に、数秒かかります.\n調整をしますか? t32=調整は正常に終了しました t33=調整に失敗しました t34=読み込み/書き込み作業をする前に、\nオプションメニューの調整(Calibration)を実行してください t35=読み込み/書き込み作業をする前に、\nオプションメニューのセットアップを実行してください t36=読み込み中... t37=読み込み終了\nDevice Size: t38=デバイスに書き込みしますか?\n以前の内容はすべて消去されます t39=書き込み中... t40=読み込み中... t41=書き込み成功 t42=書き込み失敗 t43=消去中... t44=消去成功 t45=ベリファイできません, デバイスがセットされていないか、不良です t46=ベリファイ失敗 t47=ベリファイ成功 t48=プログラム成功 t49=プログラム失敗 t50=デバイスリセット t51=セキュリティービットの書き込み... t52=セキュリティービット書き込み失敗 t53=セキュリティービット読み込み... t54=セキュリティービット読み込み失敗 t55=コンフィグレーションビット読み込み... t56=コンフィグレーションビット読み込み失敗 t57=コンフィグレーションビット書き込みs... t58=コンフィグレーションビット書き込み失敗 t59=スクリプトエラー line t60=不正なコマンド t61=不正な引数 t62=引数がありません t63=継続しますか? t64=バッファーがからです t65=この操作はサポートされていません t66=パラメータ挿入 t67=不正なパラメータです t68=コマンドの実行中... t69=デバイスファイル Open t70=プログラム(FLASH)ファイル Open t71=データ(EEPROM)ファイル Open t72=ファイルが見つかりません t73=ファイルの保存に失敗しました t74=デバイスファイルを保存します t75=Save Program (FLASH) Content File As t76=Save Data (EEPROM) Content File As t77=Close last window: do you want to exit? t78=Buffer changed. Save it before closing? t79=Open script file //Menu entries //Main Menu t80=ファイル(&F) t81=編集(&E) t82=デバイス(&D) t83=コマンド(&C) t84=スクリプト(&p) t85=ユーティリティー(&U) t86=セットアップ(&S) t87=オプション(&O) t88=&? //Menu File t89=新しいウインドー(&N) t90=オープンデバイスファイル(&O)... t91=オープン &Program(FLASH) File... t92=オープンデータ &Data (EEPROM) File... t93=セーブデバイスファイル(&S) t94=セーブデバイスファイル(&As)... t95=セーブ プログラム(&FLASH) File As... t96=セーブデータ(&EEPROM) File As... t97=リロード(&R) t98=印刷(&t)... t99=クローズ(&C) t100=終了(&x) //Menu Edit t101=編集(&N)... t102=バッファーの編集(&f) //Menu Command t103=すべて読込(&R) t104=プログラム読込 (FLASH) t105=データ読込 (EEPROM) t106=セキュリティー/コンフィグレーションビット読込(&S) t107=すべて書込(&W) t108=プログラム書込 (&FLASH) t109=データ書込 (EEPROM) t110=セキュリティー/コンフィグレーションビット書込(&i) t111=全ベリファイ(&V) t112=プログラムベリファイ (FLASH) t113=データベリファイ (EEPROM) t114=セキュリティー/コンフィグレーションビットベリファイ t115=消去(&E) t116=情報読込(&G) t117=リセット(&t) t118=プログラム(&P) t119=プログラムオプション... //Menu Options t120=インターフェース設定(&I)... t121=調整(&C) t122=リモートモード(&R) //Menu Utility t123=バッファクリア(&C) t124=バッファーフィル(&F)... t125=ダブルバンク(&D) t126=バイトスワップ(&B) t127=シリアルナンバーセット(&N) t128=シリアルナンバー設定(&o)... //Menu Help t129=&Help t130=&About //Menu Options t131=ログファイル(&L)... //Menu Script t132=編集(&E)... t133=ロード/実行(&L)... t134=自動ロード(&A) t135=&Run //Tool Bar //Dialog Messages t136=デバイスType //Tool tips t137=デバイスファイルオープン t138=デバイスファイルセーブ t139=バッファー印刷 t140=ファイルリロード t141=デバイスリロード t142=プログラム(FLASH)リロード t143=データ(EEPROM)リロード t144=セキュリティー/コンフィグレーションビット リード t145=デバイス書込 t146=プログラムメモリー書込 (FLASH) t147=データメモリー書込 (EEPROM) // t148=プログラムメモリーベリファイ (FLASH) t149=データメモリーベリファイ (EEPROM) t150=セキュリティー/コンフィグレーションビットベリファイ t151=デバイスファミリー選択 t152=デバイスタイプ選択 t153=デバイスノート編集 //Error Messages t154=デバイスが応答しません t155=デバイス不正。正しいデバイスを選択してください t156=デバイスが見つからないか、未知のデバイスです t157=検出できません。不正なデバイスか、ロックされています t158=ユーザー中断 t159=COMポートが存在ません t160=I/O アクセスが拒否されました. I/Oアクセスにはrootになってください t161=プログラムボードが見つかりません t162=ハードウエアエラーです。ボードは正しいですか? t163=バスビジーか、ハードウエアエラーです t164=デバイスからのAckが返りません t165=デバイスがありません t166=タイムアウトしました t167=I2CBus Stop condition エラー (bad timing?) t168=書き込みエラー t169=ブランクチェックエラー t170=エラー n. t171=スクリプトエラー //----Setup dialog //Dialog title t172=I/O port setup t173=Interface board Setup //Dialog messages t174=COM/LPT インターフェース t175=シリアル t176=パラレル t177=インターフェース選択 t178=インターフェースタイプ t179=COM Port 選択 t180=COM t183=LPT Port 選択 t184=LPT t185=コントロールラインの極性選択 t186=Invert Reset t187=Invert SCKL t188=Invert D-IN t189=Invert D-OUT //Tool tips t190=Select serial port COM t192=Select parallel port LPT //----Fill dialog //Dialog title t193=Fill Buffer //Dialog messages: NB should be of the same size (number of char) t194=From t195=To t196=Value //----Fuse dialog //Button captions t197=Clear All t198=Set All t199=Write t200=Read //Dialog title t201=コンフィグレーションとセキュリティービット //Dialog messages: NB should be of the same size (number of char) t202=First Block to Lock t203=N.of Blocks to Lock t204=高耐久性 block //Tool tips t205=All bits to '0' t206=All bits to '1' t207=デバイスに書込 t208=デバイス読込 //----Info dialog //Button captions t209=Close //Dialog title t210=デバイス Info //Dialog messages t211=Bank roll-over capability: t212=Size: t213=CRC: t214=Security block: t215=High endurance block: //----Char Edit dialog //Dialog title t216=バッファーの編集 //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Char t220=新しい値を挿入 t221=文字列を挿入 //Tool tips t222=16進数 t223=10進数 t224=Char value //----Program Option dialog //Dialog title t225=プログラムオプション //Dialog messages t226=リロード t227=リードメモリー(FLASH) t228=リードメモリー(EEPROM) t229=リード シリアルナンバー t230=Byte Swap t231=シリアルナンバー設定 t232=Erase t233=メモリ書込 (FLASH) t234=メモリ書込 (EEPROM) t235=セキュリティー/コンフィグビット書込 t236=セキュリティー/コンフィグビットベリファイ //----Serial Number dialog //Dialog title t237=シリアルナンバー設定 //Dialog messages: NB should be of the same size (number of char) t238=Address t239=Size t240=Value t241=Format //next 2 probably can't be translated t242=Little endian t243=Big endian t244=Data memory offset //Tool tips t245=Memory address t246=Size in bytes t247=Next value to be used t248=Assume the Address relative to Data memory instead of Program memory t249=Most significant Byte at high address t250=Most significant Byte at low address //----Retry dialog //Button captions t251=Abort t252=Retry t253=Ignore //Dialog title t254=警告 //----Notes dialog //Dialog title t255=Edit Device Notes //----Progress dialog //Dialog title t256=ステータス //----Hardware check dialog t257=ハードウエアチェック //----About dialog t258=音を無効にする //---- Oscillator Calibration Byte t260=オシレータ調整用データ t261=オシレータ調整用データ読込 t262=オシレータ調整オプション... t263=オシレータ調整用データ読込 成功 t264=チップID t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=シリアルナンバーは'set serial number'操作をしたとき+1する t270=Can't know bank roll-over without modify and write, do you want to write? t271=バッファーが変更されました.セーブしますか? t272=プログラムメモリー(FLASH)オープン t273=データメモリー(EEPROM) オープン t274=プログラムメモリ(FLASH) 保存 t275=データメモリー (EEPROM) 保存 t276=新しいウインドー t277=Launch program cycle t278=スクリプト実行 t279=セットアップダイアログ t280=デバイス消去(FF) t281=セキュリティー/コンフィグレーションビット(&B)... t282=セキュリティー/コンフィグレーションビット //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/hrvatski.utf0000644000175000017500000002123013616566001016220 0ustar carstencarstenLANGUAGE_NAME hrvatski LANGUAGE_CHARSET UTF-8 t0=Hrvatski t1=Translator Credits: t2= t3=Serijski eprom programator t4=Download zadnje verzije t5=na adresi: t6=Bez Imena //Button captions t7=U REDU t8=Odustani t9=Pomoc t10=Proba t12=Napomena t13=Unos //Dialog messages t14=Verzija t15=Da t16=Ne t17=U redu t18=Test t19=Greska t20=O t21=Strana t22=Nepoznat t23=Spremnik \"%s\"izmjenjen. Snimiti ga prije zatvaranja? t24=Spremnik izmjenjen. Snimiti ga prije otvaranja? t25=Nista za snimanje t26=Nista za punjenje t27=Nista za ispis t28=Nista za upis t29=Nista za verifikaciju t30=Kalibracija vremena sabirnice.\nBudi siguran da ne radi niti jedna druga aplikacija osim t31=\n(CPU i HDD na cekanju)\nKalibracija moze potrajati vise sekundi.\nDa li zelite kalibraciju sada? t32=Kalibracija U REDU t33=GRESKA kalibracije t34=Vi morate pozvati kalibraciju iz menia Options\nprije bilo koje citaj/pisi operacije t35=Vi morate pozvati Setap iz menia Options\nprije bilo koje citaj/pisi operacije t36=Citam... t37=Citanje uspjesno\nSpremnik Duzine: t38=Jeste li sigurni i zelite upisati spremnik?\nSav stari sadrzaj biti ce izgubljen t39=Pisem... t40=Verificiram... t41=Upis uspjesan t42=Greska upisa t43=Brisem... t44=Brisanje uspjesno //t40=Verificiram... t45=Ne mogu verificirati, uredjaj nedostaje ili los uredjaj t46=Greska verifikacije t47=Verifikacija uspjesna t48=Program uspjesno izvrsen t49=Greska programa t50=Uredjaj resetiran t51=Pisem sigurnosne biteve... t52=Greska upisa Sigurnosnih biteva t53=Citam sigurnosne biteve... t54=Greska citanja Konfiguracijskih biteva t55=Citam Konfiguracijske biteve... t56=Greska citanja Konfiguracijskih biteva t57=Pisem konfiguracijske biteve... t58=Greska upisa konfiguracijskih biteva t64=Spremnik prazan t65=Operacija nije podrzana t66=Unesi parametre t67=Losi parametri t68=Primam komande... t69=Otvori datoteku sa sadrzajem uredjaja t72=Datoteka nije pronadjena t73=Greska upisa datoteke t74=Upisi datoteku kao t75=Upisi Program (FLASH) Kontekst Datoteka Kao t76=Upisi Podatke (EEPROM) Kontekst Datoteka Kao t77=Zatvori zadnji prozor: zelite li izaci? t78=Spremnik promjenjen. Snimiti ga prije zatvaranja? //Menu entries //Main Menu t80=&Datoteka t81=&Uredjivanje t82=&Uredjaj t83=&Komanda t85=&Usluzni t86=&Setap t87=&Opcije t88=&? //Menu File t89=&Novi Prozor t90=&Otvori Uredjaj Datoteku... t91=Otvori &Program (FLASH) Datoteku... t92=Otvori &Podatke (EEPROM) File... t93=&Spremi Uredjaj Datoteku t94=Spremi Uredjaj Datoteku &Kao... t95=Spremi Program (&FLASH) File As... t96=Spremi Podatke (&EEPROM) File As... t97=&Novo punjenje Datoteka t98=Is&pis... t99=&Zatvori t100=&Izlaz //Menu Edit t101=Izmjeni &Napomenu... t102=Izmjeni Spre&mnik spreman //Menu Command t103=&Citaj SVE t104=Citaj Program (FLASH) t105=Citaj Podatke (EEPROM) t106=Citaj &Sigurnosne i Konfiguracijske Biteve t107=&Upisi SVE t108=Upisi Program (&FLASH) t109=Upisi Podatke (EEPROM) t110=&Upisi Sigurnosne i Konfiguracijske Biteve t111=&Verificiraj SVE t112=Verificiraj Program (FLASH) t113=Verificiraj Podatke (EEPROM) t114=&Verificiraj Sigurnosne i Konfiguracijske biteve t115=&Brisi t116=&UzmiInfo t117=Rese&t t118=&Program t119=Programske Opcije... //Menu Options t120=&Interfejs Setap... t121=&Kalibracija t122=&Udaljeni Mod //Menu Utility t123=&Ocisti Spremnik t124=&Napuni Spremnik... t125=&Dupla Banka t126=&Bajt Zamjena t127=Setiraj Serijski&Broj t128=SerijskiBroj K&onfiguracija... //Menu Help t129=&Pomoc t130=&O programu //Menu Options t131=&Log Datoteka... //Tool Bar //Dialog Messages t136=Uredjaj.Tip //Tool tips t137=Otvori Uredjaj Datoteku t138=Snimi Uredjaj Datoteku t139=Ispis Spremnika t140=Ponovo punjenje Datoteka t141=Citaj Uredjaj t142=Citaj Programsku Memoriju (FLASH) t143=Citaj Data Memoriju (EEPROM) t144=Citaj Sigurnosne i Konfiguracijske Biteve t145=Upisi Uredjaj t146=Upisi Programsku Memoriju (FLASH) t147=Upisi Data Memoriju (EEPROM) t148=Verificiraj Programsku Memoriju (FLASH) t149=Verificiraj Data Memoriju (EEPROM) t150=Verificiraj Sigurnosne i Konfiguracijske Biteve t151=Izaberi porodicu uredjaja t152=Izaberi tip uredjaja t153=Editiraj napomenu o uredjaju //Error Messages t154=Uredjaj Ne Odgovara t155=Los uredjaj, selektiraj ispravan tip t156=Uredjaj nedostaje ili nepoznat uredjaj t157=Ne mogu isprobati, los uredjaj ili uredjaj zakljucan t158=Korisnikov prekid t159=Komunikacijski port nije raspoloziv t160=I/O pristup nedozvoljen. Vi morate biti root za izvrsenje I/O t161=Programer ploca nije pronadjena t162=Hardverska greska, da li je ploca pravilno prikljucena? t163=Sabirnica zauzeta ili hardverska greska t164=Nadostaje Acknowledge od strane uredjaja t165=NEDOSTAJE Uredjaj t166=Timeout na sabirnici t167=I2Csabirnica Stop greska (los tajming?) t168=Greska upisa t169=Greska upisa t170=Greska br. //----Setup dialog //Dialog title t172=I/O port setiranje t173=Interfejs ploca Setiranje //Dialog messages t174=COM/LPT interfejs t175=Serijski t176=Paralelni t177=Interfejs odabir t178=Interfejs vrsta t179=COM Port odabir t180=COM t183=LPT Port odabir t184=LPT t185=Odaberi Polaritet Kontrolne linije t186=Invertiraj Reset t187=Invertiraj SCKL t188=Invertiraj D-IN t189=Invertiraj D-OUT //Tool tips t190=Izaberi serijski port COM t192=Izaberi paralelni port LPT //----Fill dialog //Dialog title t193=Napuni Spremnik //Dialog messages: NB should be of the same size (number of char) t194=Iz t195=Na t196=Vrijednost //----Fuse dialog //Button captions t197=Obrisi SVE t198=Setiraj SVE t199=Upisi t200=Citaj //Dialog title t201=Konfiguracijski i Sigurnosni bitevi //Dialog messages: NB should be of the same size (number of char) t202=Prvi Blok u Lok t203=Br. Blokova u Loku t204=High endurance blok //Tool tips t205=Svi bitevi na '0' t206=Svi bitevi na '1' t207=Upisi biteve u uredjaj t208=Citaj biteve sa uredjaja //----Info dialog //Button captions t209=Zatvori //Dialog title t210=Uredjaj Info //Dialog messages t211=Banka pre - kapacitirana: t212=Duzina: t213=CRC: t214=Seigurnosni blok: t215=High endurance blok: //----Char Edit dialog //Dialog title t216=Editiranje Spremnika //Dialog messages: NB should be of the same size (number of char) t217=Hex t218=Decimal t219=Karakt. //Tool tips t222=Hexadecimalna vrijednost t223=Decimalna vrijednost t224=Karakt. vrijednost //----Program Option dialog //Dialog title t225=Programske Opcije //Dialog messages t226=Ponovo citanje Datoteka t227=Citaj Programsku memoriju (FLASH) t228=Citaj Data memoriju (EEPROM) t229=Citaj Serijski Broj t230=Bajt Zamjena t231=Setiraj Serijski Broj t232=Obrisi t233=Upisi Program memory (FLASH) t234=Upisi Data memory (EEPROM) t235=Upisi Sigurnosne i Konfig biteve t236=Verificiraj Sigurnosne i Konfig biteve //----Serial Number dialog //Dialog title t237=Serijski Broj Konfig //Dialog messages: NB should be of the same size (number of char) t238=Adresa t239=Duzina t240=Vrijed t241=Format //next 2 probably can't be translated t242=Mali endian t243=Veliki endian t244=Data memorija pozicija //Tool tips t245=Memorijska adresa t246=Duzina u bajtima t247=Slijedeca vrijednost koja ce se koristiti t248=Podrazumjeva Adresu relativnu na Data memoriju unutar Programske memorije t249=Najvise significiran Bajt na visokoj adresi t250=Najvise significiran Bajt na niskoj adresi //----Retry dialog //Button captions t251=Prekid t252=Ponovo t253=Ignori //Dialog title t254=Opomena //----Notes dialog //Dialog title t255=Uredi Notu o Uredjaju //----Progress dialog //Dialog title t256=Status //Script t84=Scri&pt t132=&Edit... t133=&Load and Run... t134=&Auto Load t135=&Run t59=Script error at line t60=Bad command t61=Bad argument t62=Argument missing t63=Do you want to continue? t79=Open script file t171=Script error t70=Open program (FLASH) content file t71=Open data (EEPROM) content file t220=Insert the new value t221=Enter text from location t258=Disable sound //---- Oscillator Calibration Byte t260=Oscillator Calibration Byte t261=Read Osc.Calibration Byte t262=Osc. Calibration Options... t263=Read Osc.Calibration Byte successful t264=Chip Id t265=Note t266=EEPROM Size t267=FLASH Size t268=Auto Increment t269=Increment the serial number after every 'set serial number' operation t270=Can't know bank roll-over without modify and write, do you want to write? t271=Buffer changed. Save it before reading? t272=Open Program Memory (FLASH) File t273=Open Data Memory (EEPROM) File t274=Save Program Memory (FLASH) File t275=Save Data Memory (EEPROM) File t276=New Window t277=Launch program cycle t278=Execute script t279=Open setup dialog t280=Erase all the device to FF t281=Security and Configuration &Bits... t282=Security and Configuration Bits //These strings are added to the 'Configuration and security bits' dialog to explain t283=Refer to device datasheet, please t284=Checked items means programmed t285=UnChecked items means unprogrammed tmp9balx013/lang/PonyLangConvert.sh0000755000175000017500000001502213616566001017276 0ustar carstencarsten#!/bin/bash # this script for converting of ponyprog translated header files # EK, 29 apr 2017 # all input files should converted in to UTF-8, it's for sed input array=( "STR_LANGUAGE_CODE" "MSG_TRANSLATORCREDITS" "MSG_TRANSLATORNAME" "STR_APPNAME_EXT" "STR_APPDOWNLOAD1" "STR_APPDOWNLOAD2" "STR_NONAME" "STR_BTNOK" "STR_BTNCANC" "STR_BTNHELP" "STR_BTNPROBE" "STR_BTNCHECKHW" "STR_BTNNOTE" "STR_BTNEDIT" "STR_MSGVERSION" "STR_MSGYES" "STR_MSGNO" "STR_MSGOK" "STR_MSGTEST" "STR_MSGFAILED" "STR_ABOUT" "STR_MSGPAGE" "STR_MSGUNKNOWN" "STR_BUFCHANGED" "STR_BUFCHANGED2" "STR_NOTHINGSAVE" "STR_NOTHINGLOAD" "STR_NOTHINGPRINT" "STR_NOTHINGWRITE" "STR_NOTHINGVERIFY" "STR_BUSCALIBRA1" "STR_BUSCALIBRA2" "STR_BUSCALIBRAOK" "STR_BUSCALIBRAFAIL" "STR_MSGNEEDCALIB" "STR_MSGNEEDSETUP" "STR_MSGREADING" "STR_MSGREADOK" "STR_ASKWRITE" "STR_MSGWRITING" "STR_MSGVERIFING" "STR_MSGWRITEOK" "STR_MSGWRITEFAIL" "STR_MSGERASING" "STR_MSGERASEOK" "STR_MSGVERIFYFAIL1" "STR_MSGVERIFYFAIL2" "STR_MSGVERIFYOK" "STR_MSGPROGRAMOK" "STR_MSGPROGRAMFAIL" "STR_MSGDEVRESET" "STR_MSGWRITINGSEC" "STR_MSGWRITESECFAIL" "STR_MSGREADINGSEC" "STR_MSGREADSECFAIL" "STR_MSGREADINGFUSE" "STR_MSGREADFUSEFAIL" "STR_MSGWRITINGFUSE" "STR_MSGWRITEFUSEFAIL" "STR_MSGSCRIPTERROR" "STR_MSGSCRIPTBADCOMMAND" "STR_MSGSCRIPTBADARGUMENT" "STR_MSGSCRIPTARGMISSING" "STR_MSGDEFAULTPAUSE" "STR_BUFEMPTY" "STR_OPNOTSUP" "STR_MSGINSPARAM" "STR_MSGBADPARAM" "STR_MSGACCEPTCMD" "STR_MSGOPENFILE" "STR_MSGOPENPROGFILE" "STR_MSGOPENDATAFILE" "STR_MSGFILENOTFOUND" "STR_MSGFILESAVEFAIL" "STR_MSGFILESAVEAS" "STR_MSGFILESAVEPROG" "STR_MSGFILESAVEDATA" "STR_MSGCLOSEWINEXIT" "STR_MSGCLOSEWINSAVE" "STR_MSGOPENSCRIPT" "STR_MENUFILE" "STR_MENUEDIT" "STR_MENUDEVICE" "STR_MENUCMD" "STR_MENUSCRIPT" "STR_MENUUTIL" "STR_MENUSETUP" "STR_MENUOPTIONS" "STR_MENUQMARK" "STR_NEWWIN" "STR_OPEN" "STR_OPENFLASH" "STR_OPENDATA" "STR_SAVE" "STR_SAVEAS" "STR_SAVEFLASH" "STR_SAVEDATA" "STR_RELOAD" "STR_PRINT" "STR_CLOSE" "STR_EXIT" "STR_EDITNOTE" "STR_EDITBUFENA" "STR_READALL" "STR_READPROG" "STR_READDATA" "STR_READSECBITS" "STR_WRITEALL" "STR_WRITEPROG" "STR_WRITEDATA" "STR_WRITESECBITS" "STR_VERIFYALL" "STR_VERIFYPROG" "STR_VERIFYDATA" "STR_VERIFYSECBITS" "STR_ERASE" "STR_GETINFO" "STR_RESET" "STR_PROGRAM" "STR_PROGOPTION" "STR_INTERFSETUP" "STR_CALIBRATION" "STR_REMOTEMODE" "STR_CLEARBUF" "STR_FILLBUF" "STR_DOUBLEBANK" "STR_BYTESWAP" "STR_DOWNSERNUM" "STR_SERNUMCONF" "STR_MENUHELP" "STR_MENUABOUT" "STR_MENULOG" "STR_EDITSCR" "STR_LOADSCR" "STR_AUTOLOADSCR" "STR_RUNSCR" "STR_MSGDEVTYPE" "STR_TTOPENFILE" "STR_TTSAVEFILE" "STR_TTPRINT" "STR_TTRELOAD" "STR_TTREADALL" "STR_TTREADPROG" "STR_TTREADDATA" "STR_TTREADSEC" "STR_TTWRITEALL" "STR_TTWRITEPROG" "STR_TTWRITEDATA" "STR_TTVERIFYPROG" "STR_TTVERIFYDATA" "STR_TTVERIFYSEC" "STR_TTSELFAMILY" "STR_TTSELTYPE" "STR_TTEDITNOTE" "STR_DEVNOTRESP" "STR_DEVBADTYPE" "STR_DEVUNKNOWN" "STR_DEVLOCKED" "STR_OPABORTED" "STR_OPENFAILED" "STR_ACCDENIED" "STR_NOTINST" "STR_HWERROR" "STR_BUSBUSY" "STR_I2CNOACK" "STR_I2CNODEV" "STR_I2CTIMEOUT" "STR_I2CSTOPERR" "STR_WRITEERR" "STR_BLANKCHECKERR" "STR_ERRNO" "STR_SCRIPTERROR" "STR_DLGIOSETUP" "STR_MSGINTSETUP" "STR_LBLCOMLPT" "STR_LBLSERIAL" "STR_LBLPARALLEL" "STR_LBLINTERFSEL" "STR_LBLINTERFTYPE" "STR_LBLCOMSELECT" "STR_LBLCOM1" "STR_LBLUSBSELECT" "STR_LBLUSB1" "STR_LBLLPTSELECT" "STR_LBLLPT1" "STR_LBLSELPOLARITY" "STR_LBLINVRESET" "STR_LBLINVSCK" "STR_LBLINVDATAIN" "STR_LBLINVDATAOUT" "STR_TTCOM1" "STR_TTUSB1" "STR_TTLPT1" "STR_LBLFILLBUF" "STR_LBLFROM" "STR_LBLTO" "STR_LBLVALUE" "STR_BTNCLRALL" "STR_BTNSETALL" "STR_BTNWRITE" "STR_BTNREAD" "STR_MSGFUSEDLG" "STR_MSGFIRSTBLK" "STR_MSGNUMBLOCK" "STR_MSGHIGHENDBLK" "STR_TTCLRALL" "STR_TTSETALL" "STR_TTWRITE" "STR_TTREAD" "STR_BTNCLOSE" "STR_MSGDEVINFO" "STR_MSGBANKROLL" "STR_MSGSIZE" "STR_MSGCRC" "STR_MSGSECBLOCK" "STR_HIGHENDURAN" "STR_MSGEDITBUG" "STR_MSGHEX" "STR_MSGDECIMAL" "STR_MSGCHAR" "STR_MSGINSNEWVAL" "STR_MSGENTERTEXT" "STR_TTHEX" "STR_TTDECIMAL" "STR_TTCHAR" "STR_MSGPROGOPT" "STR_MSGRELOAD" "STR_MSGREADPROG" "STR_MSGREADDATA" "STR_MSGREADSERNUM" "STR_MSGBYTESWAP" "STR_MSGSERNUM" "STR_MSGERASE" "STR_MSGWRITEPROG" "STR_MSGWRITEDATA" "STR_MSGWRITESEC" "STR_MSGVERIFYSEC" "STR_MSGSERNUMCFG" "STR_MSGADDRESS" "STR_MSGSIZE2" "STR_MSGVALUE" "STR_MSGFORMAT" "STR_MSGLITTLEEND" "STR_MSGBIGENDIAN" "STR_MSGOFFSET" "STR_TTSNMEMADDR" "STR_TTSNSIZE" "STR_TTSNVALUE" "STR_TTSNOFFSET" "STR_TTLITTLEEND" "STR_TTBIGENDIAN" "STR_BTNABORT" "STR_BTNRETRY" "STR_BTNIGNORE" "STR_MSGALERT" "STR_MSGDEVNOTE" "STR_MSGSTATUS" "STR_MSGHWCHECKDLG" "STR_LBLNOSOUND" "STR_LBLSKIPMSG" "STR_MSGOSCCALIBCFG" "STR_READOSCCALIB" "STR_OSCCALIBOPTION" "STR_MSGREADCALIBOK" "STR_MSGCHIPID" "STR_MSGNOTE" "STR_MSGEEPSIZE" "STR_MSGFLASHSIZE" "STR_MSGSNAUTOINC" "STR_TTSNAUTOINC" "STR_MSGBANKROLLOVER" "STR_BUFCHANGED3" "STR_TTOPENPROG" "STR_TTOPENDATA" "STR_TTSAVEPROG" "STR_TTSAVEDATA" "STR_TTNEWWIN" "STR_TTPROGRAM" "STR_TTSCRIPT" "STR_TTSETUP" "STR_TTERASE" "STR_SECBITS" "STR_TTSECBITS" "STR_LBLFUSEDLGHLP" "STR_FUSEDLGNOTESET" "STR_FUSEDLGNOTECLR" ) for f in $(find . -type f \( -name "string_table*.h" \)); do #replace text in all files recursively d2nd=$(cat $f | grep "INCLUDE_STRING_TABLE_H") if [[ ! ${d2nd} = "" ]]; then echo "convert file $f" prefix="string_table_" name="`basename "$f" .h`" name=${name#$prefix} utfname="`basename "$f" .h`.utf" utfname=${utfname#$prefix} cp "$f" "$utfname" sed -i -e 's/\t/ /g' $utfname # remove tabs sed -i -e 's/\/\/[[:space:]]\+.*//g' $utfname # remove comments sed -i -e 's/\"[[:space:]]\+/\"/g' $utfname # remove comments sed -i -e 's/[[:space:]]\+\"/\"/g' $utfname # remove comments hdr="LANGUAGE_NAME\n$name\nLANGUAGE_CHARSET\nUTF-8" sed -i -e 's/#ifndef[[:space:]]\+INCLUDE_STRING_TABLE_H/'$hdr'/g' $utfname # header for index in ${!array[*]}; do #echo "${array[i]}" sed -i 's/#define[[:space:]]\+'${array[$index]}'\"\(.*\)\".*/t'$index'=\1/' $utfname; done sed -i -e 's/\"\/\/.*//g' $utfname # remove comments sed -i -e 's/#define.*//g' $utfname # remove old defines sed -i -e 's/USB1/USB/g' $utfname # remove old defines sed -i -e 's/COM1/COM/g' $utfname # remove old defines sed -i -e 's/LPT1/LPT/g' $utfname # remove old defines sed -i -e '/#ifdef[[:space:]]\+WIN32/,/#else/{s/.*//g;}' $utfname # #ifdef WIN32 .. #else sed -i -e 's/#endif.*//g' $utfname # remove #endif sed -i -e '/^\s*$/d' $utfname # remove space lines fi done tmp9balx013/Screenshot.png0000644000175000017500000040303613616566001015557 0ustar carstencarstenPNG  IHDRXg pHYs+ IDATxu\ǟ>nQQn k~`~MlVDQPQ麣qpu1׽cooggvg>,.@ DET@ ~o@ HL  $&@h@  @ Z@ @b@ V 1@ B+*"&F  s /䤻UV^H'HbxR2ox=VޗUyYk$pxɩVI' |.j"Z)_TUӜlc8'{C t:ߏ*ƾǖwbqzM021lAjg/Ylb@G3n ^1y婽VI/wg6`J_w;"`ìL"ƆU'f&}l`RbZ%xMHQ{<׷10^fM@]L`54UnKO[ 5Og.0E_>eL}ݕcKյ3}jcբV_NYFRJ;9}҇GyG|ɦj=cd+˲%^i Zb /mzm2nXYWEkC.YtuKB, aku7'Ba{gM >l6g}'t?ex}љo[<جZo^jse=za0E)[L\91=ަYLYc ]j)CC3W?sfv:P'L}|vMhfFȍ u]0[ʰi3wJ'[:wv=N?&¹O3)@}RؐPR09Yaސ`dToסb<>KseA{ƹԾV9i'ѻQ+oŬj͇Ϙح.Ҳ^N>>{[KO}Jţn1, VI dl(#s{ ,&Ey A>m|s'NΞzM*xZR F6z4ju(r:H[o,mg}uɈ e]ubD`T۸Y#QfDő4-WB |ς/_c;繼۰&4F'q "}8slF_-8cQ[0qĆG-&MI=[y-"~+C9MW,9|y?ܻͥcNW_PtY|c[ldᱧWgHȱuӫ?ֲ.$R^?nݦcP4|-utԦ0kwfSǷMz\㯝ߠg p`oЄ;׋c}uR زݛC_%]r\w/G4رX׮BN _v͠wOW21~2V/ߣح:sq Uzuձpyʰ]ζ, cXl.Dk;{d`T^m}cҫn[8Dv-~1On>c CMÿ߽Uϐ4{eg21H.y'.\*PnO{rݽkZ04:zvрfڸ,1A,Jۤ[g;69z5cv`úQ#\_)qeiYʟobiٴzN||A=ZסtuҘmKsz(FpE\yw= idΤ29V6y2˵.Nl6ppِTN݁ >5ϳSsѭx̝;q۷4RL5vU/γ,x/vM-ƴi;*{ ķ_O C!b(/X2BR]Tq#Aו.ڶOEJR[~X4LWi鹜\ OOJrJBJu1^ }`;&c<8d 30S5t)SIFbyYǟb'D" \7/,*=LUB P( "OLp\ecT e`WkS)XN'}.PXYf;CR 3YI~nPU}êLcHIOM DvVV} 䡈q[JqvZc[H7]i3l5_(C"-%Uz׊ dԩg/F,PRQRjP)t#~^{Z]V^6 ^^?p t13)a'U3RT!iib 1Beh3 𹐒^"KNIGڝ~چOtj=\Oĵ>Fzݱ=@-w0 aO/qaj:TSR1)F>3HI UYM?AY(LRZyrkV/Ʃ8)gFY2d@N<')~ cfܬ]37cp"7stv}}jPO3h7ȊIPZv%9Yu;5{oqbՊϾi"VvGGO)Ȏ:Eg2sGc:oaw?i<̤a/CʁsNlw$$r8ݥ5,(Z=YBI!MrbH_]8NuFMz;M8,3f G O[L^4ԅak+:'`mg :@\6aA. CMע`X![33iq3 {oN1>]L/`{ $YDh]D"@ =@H"%IU; &YΆQ(TZN '>򣵍iU; ?1"̬p"h@ɈsĨ055s%\@E5YaPd@AT]*YTڣm@ @b@ V@"X4! U@PƝ ߊCXA>,߷P DUGӹPULBmRC@>/R゠ͼ@ ҭ!`oCUjR(T/c@z1= S!|@TmPbjg-8'ء׶+_V"UR[_8'7hAMoI/U{=A`~)*MxP|ES@ ѭPJBTE$?49c+v r/~Dݴ`¯nژр2[0J߿F!ݠlIL($* -mfW'VCaݘ9~~~?OL%!(a^9b`  ÊF# EhFeUbwNڠ @_]4\uWb)LZ٧p ֵ={]ːj5j́͡ >xԋX4pĂK2Z- okIr=F='O@{{{aE{ꔎ՘{P0N^>5NqľX kT3Rq]nv.}bbXii8:}eL`t=eTS*٥k09ԕF??+ վ2Rv%5ϖЙT-DE (jh@bG7tDPa\u).aU) "UYB{~D~~Bo(pQDGkUA!YaY>xa;VF34HB-kIv.QT@/ȟ!AJBIP Cy4R]IhiP4B $+Bx3.˚?&WmovCix< ?'έ֤KS_b%*1]wC?^ykPݤ  En9joî'l@"ӥ};O=47bY2Nm_x#,tܿoX v0nZSkF WVي(QO">q `bkc.ތkןxtG>p)]<FT$05bS\=~&Dwީ Aʿ?6,Vf*=G~hRt4GD8a]W43+ gȄz4BYnjBR)43 P;aVBXX2QNKG ()>S7IfKh3nR!"ݙ+<İ+Q:z:l_ӵm&}p#\ ~ぢi;wg~{xйA-vQ¨k>kt_<H%%=fm9}`q('\q|CҮoF½pm¸;v|ZEI2g".n7\yjLؘ~$3*[S~WwvN<5z9~:f7~' !Myw=hӶz^ށsѵ4ԶuXfVĄP$*+ՕjZHKY2 aA+bdm,H-:ߙ @ [qN%JJM 0F$_Ecn似޼}o"3̯O.=tIw"Lߥ & lm{h@3mQ T!ǬC4% @(ڍڀŤ~cŻi}#7M9qQ(fu\YLr4]]:gCJیf4"7nk7t-3&*9Jr"Mr"JIh٣s9ŏYM6@ -dS3Q$H)G]O(& Bn"e$ |krR;!p_Awi^zYV-EsKjӔ= C/3^3}c<(^YUpȮ;y_4Pй]1`\IO30 Srxu9w[0o.8:ԬK.bvfw =u9JJ}]ocs%M\Mg&La|a/u@#Pv+g^[^Vha }mO_`Jz639 JB(hJPߵ$JP+lttHU|ĈE ֈuٌb!ψK|Nԩ(~<'.UNڗEʆHe-uLjn^F3#6icg˓wb~>yc(x #گݚ I\S;gA/O^\lX0g2aT+; >QyVGPJBFt*c>PQPU0+ds;ry\͖(`fKTZf DҼ6i^՟UHOTceJ TZK̙|wmZVx o_Jy?ߩv!%dZEw%WɾBrfǎZ?RVBe('wSAjD~E@*~ P qݹ@ l@ 2}a'b3MML$,(D=3+ OƱf/?jGdfllY,&"̬0HL ?.PC"Es$0 cPkzfV$&ğ BUB" m}@ 'n@ Z@ @b@ V߼)%('o U?@ HL  $&@hZ @ 6T ?3 {PY*@ HL  29<> #9 JKϳR1<@ -~BKHLjH5~K wZ!`UBUr^jļ"J9Ag@ (oz  IF`)j},łaTEI+ݫxgly2啶VʃRIv **DPD_:ߎRU ߙF@ h+& &D+@ 0ueŏ+j 6u髪KZEK+RWdZ)3& F,jjϯ<81R5=s(+P@ ]z &{ Y Sow˒WdX)=*mf%^-0vJM q/YQvșj˅VhgoQ:j!7J*#:R TJS+(yE}}1qu'cȟ IT0QFEGm $׳mk>ubom5Z 6c5&,nc3LϜM\o?s Z3!Xe݅#.>z-p7?}JG6A yc41+qiu@ar-k6l˻;{ {%)L73 @4je15!>lv[ .|wXȥG_S24K W 6^}|-c=^5pXذs]ÇNY1~F%Ү.{M#Q{&.#|8ܖ-dь\iYU$l\|.{{l/bLݦШ*_2(VH",+6 +yǢ B$V1dW$Y)%HRF Q-*6)SI êLO!A@//w<|xfz|]N}MsN(9,oÔ;[n[~rHÈ9lv9%Xqv"3\SgSjB@|~xQ~?UGF99P{nV,ilئkwU߳GG [,3>ѩ[NX_M:qj;a5xۋ3;.ܼ5b~dۙ+:D{¿l9Df_vb=(pX0 "#wg V;~i=nF4/}K>9%8}VPC`jm"DNOe07Tۘ8xyϺÝ,w&~n90ILHUIVJ+RJB]F R(4_m(:QzCS^%J=Q6Ou]қc T FR =qЄ`j̠k/܊oߟx|{~]yT݆:<)Y{x#=qjDvj15Ԝ p=|Q748;nФTXNG:)4|Ry`tC+Sss&skyG834sl9v=!Ͻf7ffѧ=/4YٳyrhS0W6|Z mJJR&Ĭ}Z Gz͜v_⠟c&^ z?ѕsoj,ξm{o|J'5;Cuym鸷tyfC|T] K(A ZLȄ~ěv11Bcvo} .8%Ύ]I] ot( n„\ ە;w.ֶzNѵ41m_D^g:7oxZy:FZFu1Cڑ <܆ۛ}~- 7j. f@yhE`]OkwRBt 94|΍jaoCWDzfuM ,O"{Z}0]5cdo Ȫ$+Z&2_$ 5l)iN; O2rJrӉqg=;}=F1(furGtc6TŹ &+bD"!L\;fTo{d< \ݖ7?tBѕ7?c MRPiDws߲^cgɌbrxEr F.=+#+ :jה.6n 9Y {g,I`!ziy;x6~+OXuyRV|3CnL_tj?k><MoUQ B"&+Z d1q.LZXLglFnD3~qwVی ctʛBvVJu ](ޗ%wJI:RK=+Z)4 J/,v d99ܫ'1Is6BqJ,L)))o)\I.l t먔;6,'\ul)nl=5gp;Wwmܝ [1>CH_Xha #*牌  Q6j H$5fTW۷e[5^l(t@tk;鏳 eZ[gex`aKVpj|{fJP*zvceJ g{)CGT3kKz$0&Jr17WJa5+%rgbSWqbBUڧV*RX)/auw+J\ $DE$E*aAPdQjzJʜ*%^V_k0kzX`c.>\ջ A 2Pj)h1q6j&'y0ֻ)oD_DnXg1D׾}e/q@#PxbՐUܵ{7Ck_Vl2x՛:unxJhWa';R,7W3uTH?^߭=$bvښ7F" n>6iÀ7óhiw7,9(ɶ@sjӖֽWm8; VO Xql{ӄ?d`1v6Wc_T"7e3ʋ h+xK4ɭL$I[ S*6(icZ[+.VʔZR(gW@q9RGTڭEGSJԂʹ7彏#ޕV1o{M YbneҴ7vno?x0f^'Nxp [|A-bS >[/|a&N7PK^\6/ÆzSwSrT "F]׵%1osèO>`Hm=A}a秷~W{?fr#_pnwsynݢ!U*LU 2TwFW6„BP:0 "q}͒cĠZ(b1`:I+Tmg> V]FSh<~n&tEV|t ɞWSkmYpB5xnڢ=XgĨ=W 'nt`Ν}{9Hʺ[Y_W|e*M`%vjzlhu/9\|.-Rrh)3M%) Q5M[C\I(7=o\~qd(v8~5,};㱡sfe/e#Z`Y5-! `TTmc97w\.&X|[㗍reЀ_Q1o`Z`!Beqv-)PLZ:1qwgƨ Aap]w8u؍Q6_ bE7$倾Y^SxZ7Am6/9iӪ[?C'ڜ)0 <;<ج~ǔ{bƽw {Է6Xذѕ=7oWn^gS?ŮMk>-d Pޱ8Ъ5 9 gܶK СkP1덷0/>rրށYcsfu۵o |*m6o_KFR$&Ziʧ}eD܀ n{Ŧφ}&B5o:quӉ^cØi'Lk07Q5MCq8ӥYv-rlq_\RߠWΫf۵Y֧O,8}aAY6Q |U`a%$軮omTCo՝phaZQ_iI()[oVۺ Kr\C֐cJޕrC9TCGYP \$RJX*aXQt5gd*'T^%?Z7sIg}huJ1r{Rq_I)V: vZDEJL{7V*5\)WB+BF=<F m#E1EZRVBbkog,ԊQI "S@ DF\ 1@ h Bwa@ Z@ @b@ V 1@ B+0ts<@ m@ @ Z@ @D>\j_@>0fLC`BےN /*RWQ(!ރ 7c?dZ3) Q@( @ /s % М @ Z =cݦn3}R%{@ J2څ4"@  @ Z@ L EĞ?r s3NJڹDλؚou8ZVzV/{ﴰ֩+6fOo+->X:%) d\a3>: yա-IGK[Q4As)p#/`#?pmБb\ 4ٸ~ ZO`qH8MI(b ;+&$Fyٷӎ;/Mj+˰5My!"Ѝ żQb@^^pq]w"^^RkP2UygYY{z̧o9E) fKD[!yvԭk`2P?wZljs5#Asn6;pz\HUK|}gͷB|/H=͑$G<6m"oM#~_?<ξUߙ4{0k~V‡-h)ςݎLuhҮpoMU'CLt5Gv5tŇ#OHG]V)-ƎIӒOx9YsPA3ozwԄiSMMChdxmY9laEF ϾtF ͌ɶI><veZ|*~=Q闠"NgZV.sη06߸Qӗe"mw4NkvjR@t! MR@J4DǴ4 #,qљo\gGz/^Įed)rDșQXw߮8uFDB-퓔 ^ O)ki/<=y[m~ ///E|,MofpZV?M\RC/!K$O5pσO ]LcBͤQ  I_) IDAT Wxz^]cʝdƄ^tu FGU TjѪ`n)\QTZS.lV_StW+*FΒJ; ==jN bGtPtr.>D^zwd|ls9@cfxrGУYR(y n3ZZ!+nǹtt ) .>,BJ?u 1KNdK5xgKʾwՁ+)R=:=G]xAdfiH$@quVkSm3#knj^XDS|&ϟ;Jm;y2;tljoY34xDgc7gd}#cٟʔbtH Ðem,?l\˛Ϥ#9i6<dw.9f?jc5W1^Nǘ< <(8@͚7~":iL yW`Xug?}־g e@d2vbz>A{qn~Ĺ̢ݟMaG \v7fT+*JȉϏO$C88i@qCٙIJ8;рʫQӕ4dLkcT;#G'ed^Ds24 SӲb 9~/FRpčpak-RgZ5u?Pp2޿ϵw1+9(+r~ NNԗ< CC J$0NփstO!5 Vs 91*odpll866&JGτT!t  y.ZziGaϤ g5ݡ4'}T .*GO\ɷQdd <׾^MpKqehTUM?Rd'Ð޵\߅^̕f]uZ\)@:&(<-n}1 v\uf9jC T;~9=c۳8x ;{AvK~|AM80s|X/y2rgh+Dp㊌ѩ4"*'?ONH. ٪.+$rD+ʟ_b/.}-^umm|:kkEΛ4tf>ۍw͕2]{xך ʮf(Ӏ~Z5=4N,a i -4ۼ_;!x<w&,3U56ZKs[4&o`{ޅ纶ZAvIܨu,6u_-lr2'+=U?N CM+ fS>V/ϜΜQDL $=+e7ە9克]>M*eN1ϞIw[N^&a\ysu[F%of A;'( l-z/mVD};X[LV[fo9lźQJY rqFt_g-iҏKzM6;:-JguffڴAci"=brkس ]g]OvImqVmvU[J~V@cc>ǗLyMZ8u SX7\"zFɐOvR}5Vs,w\!%XitJҼ"6.:wU@#UF."#*,X1!_5Ͼ8vd P|x9nW[/_-mOcpn\\xݤ矗hꍯʚ5?+cږLNT3Ҭ==ӷQ_ђ^<&rɳnu^"%p>NFǟ^^2kany?- 39R YܪW52e~MOf*Hz7cijaCxibBRw^em;J3u{YƇ,Y}mcO/s-$#Asn6;pzdt۵Yid"{鄭C_~4V֓#8)/5uJy"Ǿ9ޒæM$*ψJ$uj5t?ĄiX3̙tX;!426۰z"#O@6jxMOg6S=o.]oȧrן.inS0:bX,-݁>Ìg:?~ ;$a(+FPpWց8: Q[ںuT{JTHԉ`-2dCHB潿?M}7s?y}ޜ@{~<5ށ%3a#)V9ʊzh3KQ'ylpJ;+k~~,.A5da׌0]b۩:;R!^1;t^VZdAX46W"5xSyvE{pŹ' ޚ޶ 3w%Y?x7ʆ3ًnІhJOE7 Z4`|9zRRN ( %SVbG} A!;y[NŖ6>ݮ~cIZ#[P%Qar2Pk Lu̻{:ߍCWyjPO/ij6NwG*{#+-`ٍt/Md횬,._đ,t%uyj]fw6=PA !ڢF^|4] dJpunu!Zl[ʑ XL+Ϊ5PQl2h1#m %϶$kGzJ+5|z^)Hwi?$O1g*XyV♼jE[}dE0e[֣zXȓe߸Ub]̤ͮeNdʚW5VifEO"޾c\}ӽUï Ag~6^Fa3o7& /tw0/c0H ǵf 7;v~=A\oS@fXHSeF]m2(LhW&8.o|L+LVaM% dIوQWQ4:V_qػ4& +_IR;`:#/7^r6v7.m-}(-wos! q>Lr-{>8CG o{ۯVSӏu9+[=͍sމK D|`r(LV']Ftp7'iv\̦Ĉ>ixM8\  $ΛkWz<*'C)z}+"36`]1((8k:CƝKʤ2Bm}fAe f@[?Ν9wω .pe귧g8~n^װnޙsΜ;wf f8HΝ9w|{HWo)M1 iC*OE,bB[5*@ې"P.\E^])UI%'əAmkͱFk;:R{8WtfbШ C?֟O^YS=m:+jJpLr[1 i.$oNٞ}"9 nW * mKw (0u-cEOCzyU8$) eq+QA-i+͌L Xx'zV$GV; V",+}#,?L1g6i.}9!mj/ ;Kk4³i*&e>؞ФR˒~|xkwN1JTa:`9O&_5eךSqPF_ى, [xknBc:EAne=р(;0'C=\*2}uXs~cM>rFfLi:YœT`B?i?KTjUq j1UcSd1C[c T8qǛK5vC3?⣁s{Xzl~CㄭJ,;6{u9D4AuӃCkz=7lI t'TV=zBÒ%GV-Clk\h }=;xq)G[K@@@"ǏGM&݋7~נeL2P72$#WYyZPȊW!C|خd8.E b2A@@@@@@F 7Ld3Pdf,?d'~eӈ?KWJ΂]G.x(k=ovRde ^KNI{PWKrMKɊ ϸ7[FpG1SjN^`$#LF2ym~hk>xC7{of79\|ژ)wgvk{ˡiy-k1 8t񜆍W}ٙŠy Ɂ$K-?^;Xy=#W?Kw۲7x_|NmHi)u,5^A]Y'WP޽ҍL^K ";h2Uȱ3nuk;īyl&a/) Qu\G&%S1;{OT1?ifhm{xVMVΑ/0,>綕M[sUnǤe.ty!; hJޝbV~c/vvXn߱/%wOCB>vS? sBt9s{<%z\xo}Ĩ2b~\Vf&|Źݙ.L[LfG>ƃ`JSr~[?΋A/?tyia3%s.%vG̕]Ҕo''es.)l Wp IFzw_+mI *exp8PuFԘuuM@7,=wjrԡgbϚ_w&-Uݘ8ɐw̡ &txߟ/8+hK\8jVeq<"F'ތ ]NɹaCl?쐉AXkڬ=S&9M-me6x}1K>@qڒ1m ޘd\|Z?,Kwɚ޷!cv99¹xαsc9EQISaϤ j=ue/:6 30*iӋ"YC[9?*Xj%h<5USZOf_YyTޚT2pDPF'.UX/44ْpxkz$'.MyXk+pg WfI|ΛƞH mILpg; gH)0rb%]rtvn$ PƘG nx*d%/b|{H\_OAb#9TWbc/W2nVtk! G7۷/*G)ŶSuvCcv鼊겸ՐU5^Hd F#,HK rf,K1'mC#,g~'Q<M m 6ӫ)n]-^60sWyl>C Otu7fFn SܝqsBAfN QѕF}ԆTsOzc`ysPm8[[۰~wYŠ$L![5?SM * D>_Ng`@{~<5ށJAQ2e &*3+ e.=&C=jjAaEcjs%RC{M<σcã -,,?&/<)dI\Z B[pm~;"d0uSb7vR^  {oN&uu;Ryq%\g7hn{m$kdeq"4'Ή5߻dgL]I]+vWFn]lͫ-6_ (6`瘑l{q=^Y}h kt.hS IDAT4QJvVygS =P+NL(lt]; &AՃwzXȓe߸Ubs侃_έ.[mkV_9Ai7,m=ڛ2-cX(.km(XWfײ^p'2eMLr_0ڢF^Ƴִj5#bLz3=C}!yQ]>SQg2\qa+P'+߿A2N\퍜߫~SE-=RumuE{'s# O>儴񁼱O.EJ*?MS}?tсA.}C4aV;u 3AǘK%ۥJG, Ԩ=&hbN|2tD B%!%`$Bv3dʠ2@VjKj&ak Hl׮[Ħ 8@BE#mԏg f tc:Wov,LşsB 5Ơen]~ǘǍx<=P6+R4ԬQ9-% L3 ?kݮR?2ӳoz^g{ %q#'N\fOno?(D4 W.E?0WT 9#HX܎ؤr`2!ib6mwxg,ݷu:9j![0a:]{DŽrNGU}$巋5Ys$xu{xuymw {"$Rȳe2+<4q#̨iOr{PZZHr52Kb/ɛS.60Gk6R҆|ׯǂ/}4L]{A@r@wHsە4uŸvP)(`k( U?WgY,bArBPq6֤ո ʕh7ܙ[>y)Ӧ6d*WU432WoۨINv$5K`qZ1WXz67k+_2bYia;&/%lhie ,'Oݻd>l~~2Sۡ>4Xu1CB؞QU~e+Tߠ d}0Wjn粦-ƶ'ۦU텢&'aY,@HˁŲgZ-Lc0\Jcϳ@q6d_}z, >В悔,h Ϧp<*;3c{BJ-K}/ (.دA N JNp`9O&_5ex6ɳ긢Nv4_HqFB u8yUJ~6FF[_R"1P#ۃRij p\ԪT@VDʢ^Ü yd\U>VK3GZ>~ͭ[h7]X\WQ>;=VԪ4oAju''\CL3)Ww]Z5gn>4c/g𦊭 GwVԩ1`br3\?2ۡp}5.44*-,YY귃WC_9Mu«[i;%/h><|la^=)~CRi<3K# ⮛G߯:_?]X gQK&mY' d>V7WO<ٱV~'Nqwyy`3KnΉ}~cAE?€L Ģvض^GV-Clk\h̐],Ӑέwc4޿ k T{GiԦS?Qa4.~|~;<72ʰD(Pd\vqyr ePO_㷷vd`#"%xL._h>q)zۃb-% xǣM yxLC?5Yz}ĀYݶeJ:axEog,s]$pEFv$аRdo?*3<$el'!xb_ja+d2 Yݔ9]̲tȬWc;7@#We~6#M6uJQ ݛ#->l"abֱuXE% c=6lm=Wph$5slF2?gdzޣtUAA3ZDIeO5~yHNGOh:R #b-v>YfЎlrҫbūOE>|d2 w՟ܧ1-'5ܖĔ .qx"(;} ,'V{i Ng,M"Ǟ}pxV#T__JN_䑸G3ă\<868ػ'X3"=O-Su;O ,=ub@Uq*6{s??m`.=AYj`bV_Me3}ٿߌĔͶIׅl=D;^j|w|!d+rQɳRpd8Mݸ CmQ[$42[+}Jxum1" Xkr;l;֞iRU_X _Kk@Ag 3$}F]F{~K\ (?f-BR5oyuݖKFqZ˱'c){iEyW&0mEAg߄B?MIOF2(:AH$@] 6 xIݥaw;]2@VjKj&aEt.pK8uE!5kT>gK}t5j[3~N(`0L*(V__Y@@à3K0M#2f)^MJET4FQxjV&5±`4O/HL$Ddϲ;i0Gl>&tNg4ۮwNsX.sʦqPu{e_\:I1+7?;~_o/7޿0)DQ&d4_]m8kʨI_ڑ,4;&cȰ'RV{xuymw {"$R ETY9j 9=yn${Z2ݯ,Ӧ6d*W[#rd V",+Q,?֤ոXӣ} 9_]$Jb\E\ﰟ럷W_Bf3鱢 yz3;1\f/C?֟O^ybzޫk_zy؞ФR˒~|xk7 ښ^X-U=[PkC`9O&_5e̤dzIS)ʖ Lף;Ҟ1L*ZU0 L/d\~~\tU._'l8 "g8!@틐.AS`O1@jrWOZ3qx]w7XZ?z+M,FoK3|G!!7fmXZ!}[⣁s{Xwwl-u ^k)AEhv~}!T X5.4f_?]X gQK&mYкy y\]v^l-h+=tmID4AuӃCS:LчYt?Xc;E4Qz7=S.aOerV_v/ap=T[ZAGնyx q&j?I0 u =Wê1La Fxa*KWGoQy#,NDq)6i$QӦ~I&75sii*K퀸G_?F& x'l[ۀHE@@@@@@F 7Ld &okw֔z *JH4_ EfBNv}^= i+c^`_EOۜU ovRd6re &Y|m+9"u~݊9rFBbג}'?Zsk(- Fȫ9ܙcgꂖ,4xC7{of79\|XGmiy-k1 8tV;B`K9.o c-?g}a蛧v =i巛F@jN^`<zuARݶ6^S4_ڏ\ 4v;4[Tik_$`"ӶU?<6c{gꔆŨ :#ג)']M*;G/<tڵuҟ8􀲽}׋T+j2Ft)Hbٻ E+2vܶ'χ]"34?yݶvw:z%dBY!>J>%|19󋝾RT4u[ɢ;YCO~3,)2*󲢽'4<@]4biO"txUg3dSQн9FcR {(]!VqxnjO1ze鎑Y˯8vn΁F lte lY̺47p3zqԡgb7/,=pS ]g5>FQ5+ʮ :~HZEӤ1rҫ@w3@$Ij6GOf .CnV~~g3?9ܶ31?gdzޣt@X.6VVV0; =XαsJ枙C:vf]Iُ IDAT"=yeui;S>;-t %qzM[8/}s_ ߕLC['"JL>ڑ.!4~U=݃v)&c{ښLhnKbʄs8YPi- i9_ ^ٟb|2)=4hрKtVII @ rf,K1'J" ^6B8l Xh[PAJ@G۳?J):#SOU<ITR,Ƭ.KP Y5pXs~5czfeE=<ouTtecc.=&Id3=-UcbY.i4E;:zH^7';_;2%Qar2iLƸ[y 6+}4 v#Q<,;]t"(Qi^[UuU # {oNOik2Q[W'#Wy@~vF&OvMV/Hs"9 wV]I]+vWFn]lͫ-6:;N8l\_ D yQ]>SQgػ»f;Wfײ^p'2eMLr[ ĔͶIׅ.xgD;<{Z>d^=(ywXJc"^[X[R3"f矺ߒdض=4QJ۱Fs bڨWdbZ Q}z~̥:36ۡe:F"ק>Q5\t6`Ay:UW pb\cݡp8)Wăچw)A-yKՔP2X$06.iNU>֧[ip\+o6{N>BŁZ{1u]4LVa!M9yqd)\Q_`s ̡`Fjq h&(5jϾ ~: d&Q*t@IdI30dh(ZM]СadxqePUhog5{50ILI8e Xºȋu?u4II| {YPT#4S+?  7kz'~A]{j(D4 W.E?0J@1<~g4E#mԏg fx9} .kR# ~c'F,g'tr4؍eAH'Zх|>6WIi靄( wYv'6mF^xi, Yr9[KATէG{,03&tWNg4G_;䘫\8B 6s밖 ,wno**wǜ$uc'S5ԈK'^uspT=zh.+8I LeMgq©!EA ըy}hbt z֔Q#YPiv\a~룪>hC=yF6䃻GԽ WWW`Uu)GI=~V\q.K>5W|1X36fL0F ݯ,ACzyU8$) eq+QX#rdLr%Od;m.bFD|YVNKSjJBյ{7RPW3ښviL=,jGԵkR>=Erݮ.U*O>wMgEmVIyYvUl0]ڏt?p|NJڡ%úUPȶ105֯@^cҙB^\@rt ^޽KNVC</tʦ#(F]joۯt:r<Mukx<>j%^UY4I joU_d\k O]hhAUZ}Yf'jK/CXJJ]gqյ^ Lf_uj5֜XӀQhvwAzp򶫔^l =VB$N>c;=կhKʣW$FTu^jcVRjZpJ2YUzH!mlƬmK4$>sXݪ_rU7?z n R굹Q,. 5$\Z݄s\G?i?4Ś"tQcm3pG-e& y\]v^l䭥`޺_84^;9_dKj0=T"qyLS81yU;mV{ut* A!}z鱦I֋VMa}wwަ@~̢ v/D`zC3WGY1=z7ӷH`DG[C tCFvu ?:< zpyWJ>IC>~6ZeiC#U^0N \[_D3- ?ㅍN37kB]7;u>?q\2~;;4~[iB^?$XSV4%Dv@# J#ޢ% x'l[F2d &o1 x#AL&= EfBNv}^=@+c^`_Xšòcw Nv9z QFWizcVL@M'Ok?<=60P{ebV<ទ+`mm/>]g<$Ý9{ƭ.({\bMLVSȀ /_kq\z}ĀY9ݖǻflvLҰu\udZ2eIe-~I'3 –'7^;mnr}aH3ښ+5%?+[gԻ7~3zf}ǫ է)+%9GK&{ggC5K{_.M޻_ o?{̽M6L(+6^}0"0}g';~r/yJ$eŹ;70ҝ ($\uieUb2{?5ap`˟dL ZfM6pQ*veW4l~>A?[X\6z׎U7nMY' _g(=q G$͟nPm奅͔tV̩pkc 4&6(ݻR=i5i*$ӳ*(\J,gythVo|*2_hC,%|JW?L? nO&{4qG7<*3=rֆFҰ;m~I3OG:](*GxG_*R={O4x'y[X[oq N-؄FbB\qm˻U'|~˅ozQy¾Q t4ȹ޼"!JQMHR}\ذ6Z^EOݹ{sANݷ}kMxڦ*{iblw[i8_Kksޞ׬i>\mҨ]:؊9h]elBӾ.>3U=rRڴ?kcjѪHTju[A{4Θ1)|',.(FLL&UŢ`YpQ瞿ly}/*fݭOQOQYx#dqicG[9d`"TaL%+vg ԉM"SJ^] @|ꑒda`QI$9+]kTҳڥac42&כ'S`lz <-Qg~ypؚp&lNb?/ EܿhҀWq7؎419Fv z?wnλ&=1.< u^y/*yhms~hw?~ƛtvmڟ57z Ǵ(֤WwljU;wTe&3 :J qJ(b=LFT2 ufd7#;a B!Lz Tw~ò2 fa3kJܙ5%?`=y<9KYU|_͆צ@Rc< =y1>pUQ:y:M,tVV#o-.!JֳEh&8׼Ìl2f5~'iys,18rf€ӀB]a6$U РGHx>WPFW5K.Liju55+b|9A7+/i֠+- r*X0ͯsFS2A9h *L)MH@JKW'W>~9ы+'rHj»_( `8e)~Ç".ѮĈ)Nz1p\.W8B7"hMγz6ch!ZŗJIag8P ﲃE7XZ7N1x}Nگ>ӑ/ע+Az^}ޖ*\5jSwuX>˲z-OtvJ%x5q {2+bdӒ'{RQm݃E%hƹ"dlM=¼S|s3vQcyJEu9.9!d?0ɫ-C[ Bo_IjTT#s8qujޖzodHH$ﭳ*&4Ks0L.*!vs):Wڶ?]7䱇-ɖ"·~bu(ɱHu]8&dqƋipU|yT^H  |%4lw&O/ڲT-9}&0W,ȿUgl6t&= EEW {B2ӼK#igTZW'\Z,)afs@ [,;P 9~ھ_w6WjqsLI@Ĉ%>Vur1r@;x/?t?^|o$'1qYvʶ$shi$Zk/g 4 G}!9N{@h4ۡv|ŷRwߩ:ɡ>[Z[YlG'o^"0!M W/5=yCF`lg[&:UT[zgFW{Lةq$6=~8_jjKPs9ͥ[ӆY#Cw*YaM-MU'p\)$0 I!NG|`5cd1ucv^hӧ}N,yb/AA11^@ % IDAT@ ZJ&@ L h(@ *P2@ Ud@ MQrķŭ`AK2!MK]wz[Ϙ/vSG5w^߀kg^nL9>V;\vNܰQS+nY;߬6ӁP(n!({]3amu tL!0m=vMfyvuqEn ?L~<,JG"z ~wN۹[dcYR3}o~n3[H;܁ vuE/:~/#@2oO[Z4^ @tE.+Μs;j$*⚸:VC]+^-X^-ܜ#BNos WW{ƴ_E_U ˹M~=+st{r-U A%Ė$%=vGxUES};:WjV&w#W؇*ڇuܼ*GKvS 9Ӽ+/bjA=uo:=^bG2[hMH苻[,.85MA=huCUSٵ?U4$hRQa1,8&?lJۋJ\l} -V3_tѬ63]rO71im3 2Π0Ln(|rl,L3-ϊ؎L s& 3VVJOl9+ 8|S #ic- rb@'6EQt|CsnnceSu/h ٘U‚Y`\\R6֢2`P ϚxGl=N02ox>gΖIƸ3( :Ԃ~VW eя:vCgwшcfd6j3Z;8OL,y {(Ce DeVU +=S;dԨɨezr-HO7٢l)O;)*PTe+LnolR&0SeW>;fNwxt;xo #ZNn:|PC:<=QG( O_t p%"Ptf=Mi CWfT <^h5 *Vfiy{2$fsRj9M`д*yY- sKK^*?rkJ(Ұ;m~I3׏fi(~rKhlfgs+HfG e>#Z, %TsV!YL }TFiq מGR TziIyv,pٕDE:3D(͔ 7:klo4`-\}-RL*̧ A_QBt0)!UV~^.?{<|GAƃZ9%2i.8# :Z `&}&<⿂NS1R+.@yBR0bdRMP0@QX, QX crױ.q#7S=U?1mѤdEͅf/궽 Y̆IKѥyZh)^-AD+jjV0s$nQ0:Ú<۞Ka[K{´xF`C"T27wʯi_]%,+e&ֈ^]1l 3y\u*,-8O ?ds]ѾJUޙ%vSF镖=N'l}s H&#Y? OLM(%rqQ]G#8|%Dg=z*I2渴hk -OtvJ%:/52ϺyUlؓnAe7g=oO 1Mv^&|z3d2\IcH$k$Y Sg?o^zO<IG TjLPN ~3X*=Ѕ粺k;IsEs ףՎ*vav\TVC%Sh~F"hMγz6yZ ՈNvڽek}!yT7EUc[-oo㠪NLJ:2k >4^LZ˫:BBf8`@-0`ӍP709'}?xB =|@W͆.4Zkx}rϖVvɛs)ےDs |kƈ_HtނxSbр]-KE #߽HV4v^}LtDŽ#' :mzpPZcl(}*n篕Tӏ cJj Ӂ>^'ar00zuWͶ)k|.|jGPF&,n/mo㠮}Uyilh7#i}-V]S;&I35-ب]@ rxAoK޿F]KD)[;j=gPLe`{|k@ ȖNkoϙ@A@ V @ %@ ZJ&@ L hZ iZCֻzƬ,~:?1ll\;P#@2oO[Z4^ 5}%K׻ӎB3( iO)RuYŕ޶Ss3‰F 3קr]“>^`1`'\2n0Jae%$3ܹf9Gej/ F7II;>dݑDCڻK?h?G{60^hJ&*lnXoE!'FxNF-ӓk-\Cz)ef7QEgSt IuAUTসƶ+n3UvS嗤rzvSUUya}] 5 MioO¿<~:߃? (*GxG_*du%Ig[_.jQ8dD}뢭֟{CIHJ`RG33,Y*VJRO0YrVYLJTaTaK;vR(,(XZZJUo{[h.v {d8+}{D5!UJ ;UZ֍&1YQ;z͚u@;$zk-"~tv`+vq; vL55@Te?M}B=5:އ .Di?`gDBT_|&S3ɼ/q()%C 90#c*&S*]D>%fDe)-yZ02nJT5a*\P]\? teQxIc-dyܹ1sZ9M\kЍ0&cbE]x$ ^Tkw?t@}?iM :M SJ^] @|ꑒ|iM̺j'+sAĈ[^NNԃ9cpqa"_4ti@K-`-C_~cuYgCHĽz _ΒLYxSٷ۰F4zp8%Uٵ@Un38 u4^*ĝ;/}<^|'-9de#ם(#[ (xvF-۹/BIJwL9}wa'6}@uo'(Ѓ~Y1j.D&)?R[}i7`=ݴ|:POj%^]G<5 N860Y0Jœgʈ, Jm젆G^w,W',k(XXW(&,m@=u3Ft}˂kN߷u]h;MyD4xrR4xSDz}; +3'K즌6!?+-u{\\!NDY^oxc)H>uv'FLqrJ 2\D]ɖ[:R } ںቋB9ye 7*7*ڿ>7c)w֤GHE5;]vmP;Ӟ TjL%k8cH$k$Y SP..*b\dыƛ:9iOG!󬻘Wņ=)Q!g˯o ]iI]?i%!S%G"8Z؄уy_f+pS|:2P _OVO;qlNj1aE3=&t?Qiӣ臃zvq#}N@:72aᡲrK- fyZI5x9$1r1Uq>Vb[xo ~:gC %F¨fi ,>4]4|^I^xwh;SgB[64^D%+)Lw׎kUԎI 6p016jE ?>}zĒ/tS3@ L h(@ *P2@ Ud@ D@@ V @ BK2!MK]wz[Ϙ/vSG5w^߀kgE;fwrÞk_%jJv<1kGqU4#Ӄ,3_3TMd l*u$m7ܢB]tc褟Jt~wN۹[ 㷑BYTy 7P() ,'rtMpgfnZvL5|uœ%^wr[϶CMSB:o*+2*Ut9>nuo)Jʼ4}x`w_Cf ].&~n`N )7~rI) G0\6VdVXݠy, dj5<[>D IDAT~_?O?C y~E$2MOEN;5mY1YoDc&Lҽ{52xœ_ ah$q ~LD {HJBR#ht Omq>FPWl>'};ڝ|9!k̥i@ό s4Ƌ@׭΄%~Q[tw趰#^+gc ]Y?bN?2pHE%WJ U<#k8qj;m Qy/u["4]ʻ"ނtGP6Eu8QԎ^+Lȕ; 8B9o[Os4`U=U ".#tM}|>Ꝝ_z=`yژ}pf[υ9,gOř:0O&== X܈.*,'XI?*K(B[VNV,!?H<[) J-RH nJ,4ż JyaL1iTa3]F~(R*/H~`I/ |JOl9+ 8|S*}v4! m^hJ8m*w۟zގx)RuSu_(!7ZY2n:Kە`1^&斦ރ=WViSԥ>V+lnXoE!'FxNF-ӓk-\Cz)efc/`ʾYVKŔZt*[a*pS}cەz7*IƺQ@Qíbj2Mld1JT%=TwYiD%$ )l1 {؄Fpui;Zvw6;׾NjqZcs9fm3/3xAaNWyK׏} Nh`FTLTxPFP 11Tm P,`MbH|a[Wh,PI6n}}J̈}!+GIzhdTXݻ: ZaO]$nMذ%}%T]t67&Nv _1f>5+3s=:!}ct~u_œC]Ҋ18F(fOSjo쾸lu0Z[43A73n| PRaޕgW~m?νcN:0녇 <6qM6iPoL%+vg ԉMOҪP4īk':ƦkX[/XQ` ÆzPVDSg d`shGj@3j):oLQ%]/RY9,i4Lz T~.k:As3w&7]J!w6?-VayN]oF M.}; +3'K즌6!?+-u{\\!ND/Pptfe3yY,-ƎSFw=|(R:OdkȬGxipDF"YS}calʹ]]&U}ɔj_:^TT[ A ƨʓ>$[N4x}aZ:}dGwx3jY/ ÜM7C0wxWu.R-::}qf@W͆.ߤwrjzk<[0.%:f2VndCe4>oQуy_f+pSڽ_i7K,~~p5 .߽HV4v$?ֺ\3~curthrB6is؋hg^=QR$]t߰7@/3ͻD?=viQW:~UXLl;9{sw3_ ~X@#eGJ$v8GO7 }3fOlh%K1Qt}DCx񽑜&k@ǝ:5o;*бS' :mzpPZd=1"'fI 33#*X3\ xj47)@d54śitr?M/`Gkj$btqu"DS>=uba8fezyAA11hI@ \n4XI @@ϲ@w@ L h(@ *P2@ Ud@ DkiZD?;90x1@u2?yt~2 jJv/RU o鬉$˯*]z]MK3|ҫS {gPJfbe_@d[}?KPAzDoON9`:}(7 =YϾ~p=OAέ+%XO:%3`\Ɇ ?c2t>%GW GrmGyg.^ߧJo#7Nj]\%{u-Zi;ghh>A Ac2!+8aɱ/hclL瞩aIǿS@^ٌ-cfўA/sdZWf[a>ݛ`Omo,C"Ѩ8#Y:8~7he=VoҭR\9OS:7alRKCRzFkoGJXzW?{ ~Vg' )dW]L=V5tķE T9o5nNӧHS?3ގv}[A -DӭKyWY[њN>զ("<3JkE4sg02E`lNljadCitv@\qԧl?9t0:59xuӻqaYp"|[Z]^4 ңJOl9+ 8|SM4#9z޵1 C^)*TXOb0T'UPnBii ;Ӏ.Xɍ쒖 HbIIQ'zԶzs 'rX7\3guGk^!E?yfK4vj? )̪a]`w9LOep\>[^'չՠ.V 7vvM`ʮ|PR?,y0y{2$fsR @3<2|# $R3uO[3dQ˧KTx܀7#{cTUU۬]H^W](w;Ճ x^Vu*?rk7e>^> АLTFiqьL5ELA܇dAؗH:&"E,Rj )PXtQұ4+zg&?NX[o.zq]D>%fDe_Up֦q4yq9dܥ/(cP[yNfLdJNr:lϻr/-u>iSoL%+vg ԉMף$ 4pbb*W ,7&Nv _1f>5+3szvk†U,k-~ ({ǜu `,cbE]x$ ^Ti7Ӗz4s~hw?~ƛt/jhW,.4M1vh }&iWe&4@@ B#,׃)ʮpɭJU!܁xYPAN"|g+o6\wڣl5tog2F1ao)QLX<٥DKT)w]xIZ=4Ҽb8#C\׋Q%]/RY9,Ss;lh&xgH|g_>{_nx]<6C|:POj%^]G<oq'N860Y0Jxo0-4xXmz?T4 zT)ahu`WogaRw&dݔ&$ yzn+ [?EfN?xQ"zPץ>u1TDRe*YßodQ]\q \މGUz֡ %euv^ٓ=Bo@]vps3(@kYN?‹Nۄ%5ɚ= cSo犼5 N][tz:^TT[ :i.t^'1{ćϠʘ 6@ V @ %@ ZJ&@ L h(@ *P2@ UhI&iK9XvEOu~_c| v6OO PdW .{vW5gK3UNIw&9꼳#l8] Pe=Qؾb;a eg:7ӢGd㆗vgE`V_8}-jt,x榛C'WF"7cV&Xz_QJ.Pi?(0)"]_޹dI zcz oLb;&3μsp{gv'>7&^/OWt $#76t7mxbn>x)oPSXܝ=&_O("=~dv;[Ѹd돆$֞<~n!:3eޢ'{%>7?JO 5quLq;LߧgsJG9C**TCf ].&~n`NzvӤå!YH4:&UN22= vkh@2`$H$n+⍟\5tRJ+iQ;??}>#Y:8~7he:Yb{8 3&Yk3Mgu(3a_֤`]~~!oGJXzW?}{jcz jjϼ36*P_AXv_h;m>7)?m9oI>ѧ1v&y^y0ĵ\)a/u!y?YMFz% nGǜsd#Y'%Q}H<,#EiTU B[2!ʪ#esL95jrk^\ի̸8#[ 5ϖ9yYKD8h fBwebD+Bsu@YW|;ܥ;'{#i˪6T2m҈Oo׏^T_USo犣$+mST5.SpX7e[w4_:PKDaRե'>>΢R^O &T\R>֌Ef:1Re]$ݞ];u%ųA9 )Y~W TߦQ4q!N= ^~\fiGx,\olrר禑{Rm2 rҳKl?*樆%#@2̱…dijϫ\N*p:Z{5ʤ2A-Sٮ3sE;T٨V<:-r?o&>0¬Q l,7d~Z屻RÆ 4 A>@258k]shB#*^R\懺#ilԏGMkF.xdH҇nB!ի>'|4 _Ud\RD4r?zq$> ,~p:S#Xdˇ>*늛|߬Shw"y) ȑm ]hfx^q4,[ƽ )@}+a aZ0ptn/zRAUk#..}^T@Æ_ZjM@=L@@"P'SZ] ꚌppȀ3eWaXyU-$|Sz&M{tMn&$G6=azN%{Z8띇5*T{ύ$QAS,J=ȑ  n4Cht>glu΄9[7AT4xX>~o)]Zhx_"CMrIQlb):v/YI:zZDi ;% gӐqӈ2=gmcdΕy(;~Yb#0!±>{e=WhnL iF.,9,.uT+}r?ӳYOK˥eVXL֓hx9:v6,)(U.~tt'Gg]"J׏:Ӧ Vj\Q6Z ? V[W(H)k'lI`cZ)jkoJ%9ٶvޠHlNv_/QSW|3vJpqƝoXC_F)j8DȪ{v~-v~8S sSwq0oh1\-/*ߕJvϊi" hD2A@@@@@@"dEA  ɄW}.G@@@@@@D uԔ yROsrsA&$MįVe+: cm҈׶^3}ن\g`O7\"'̴oMq{=5]̾?KkiA)M_6;bܞ?ApDСEDHױ'YP72jjھϛz!uG&g)PiaݳW+{]]}W1p]p?ݪ?sݏl/i<擾]X?mu޵zR:Θk[ZkN^g*ܪkplc̴7.iT>_ֱij@Pem~jA5zIvїG'9 _xmwru٩aW^٣)#bNaLj׾]fLjQWXDQ?XEMIbC ]4°o ҧEBpbގ PC5IC/KUT=)'}}@\zP@e-sN+`2UN u@#DžE3ܦ2p`͐?JtF =W ?6VٽԓD5t'h;Vh¦el+ eW]L2_6Oڮ ú촅Cφ\_kYyh2T3c:(c;-:_q:3`6a:poffLJ㡧os&p8M ) ! qǟ6uR? F$;>ï"xB:N5A)Edekl-O-{$ d?vֹU4C/?Zu9[}?YnyrtD%) Iz"EZ+~jn?=DH*O0X <4_$L![!Ia}Z?B[2!ʪ#esL95jrk^\ի̸8#e7m~[8e[3$1GOZX!;.krprn5_L3j;Vuw{㤿hAeR])kCțciN?բT%o $*AAgg_VAВL , "W)=bj\2Y D.؎  ,\XL&9ml Q %E8ʦ2A-Sٮ3sE;T4ܑɾ]F;ITƳQ#"%|k۸V`ԛPH*ω"M—*E5{4Hoo OSĵWvo)6ͤylKhLp`jGt~?͒My 8k]sh5H9ld16OŏGsVާF49M5ǮӼ~E5Pl3K_:nbpSC@@<r=9ҪZd2dW0gWL1'2*EH\l ZOng_ߜ5w/gz.l9kedXG9lozZ `tLilfZ|#vsLlm`kvO?V2Lzra1W>Ҳ!{A"4K.Rz?zOZZ/~Hn. 7~$ 6E,O!-Mlc/tӼMZ?CMk}-E*uމc!CLQ@ýSS6) O{yz[vɎ Z-7LCq[?cu)O85Q]H}#(ߩߩʜ{e=WhnL i(^ *7KjLQ[{XV*ɶrׅS^W~6OnpRr [SO伏:-k:Q-Wr 4x埖ZiQ-.W+ϯ:cnuOz?짺4Z8zL?+?47[AaK)]A wFHp l{g6eu`=~NˠE ԙ>oZ m=͇7.8R6:e`p鬄p;ބ#6>#yG+ Ӝ;= tӌ9 @N2cݫݖ=B W/S 3|?##G x]E䲸%y Nk+:ۇN hD2A@@@@@@"dEA A$-H&ZdB27hM{՗%/O 䟾1v' $הn ;*::usI#Ͱ{?5;0{Z;EU vsN_iɯs^`>pMk"FW (T{~ɞ7qMpw[P-=J e,dj2g&wK17]_sXheӫ bCfILm}b o}F鋂6*ѡ\ƾ98`ϯi5M.#̉osdEsך[}ʽ4"ٿr;|uݍ:ct`7)k]k7x%o;3Ks53(㜂.Zo|&3v{njSqLb]ÃRFnlq3gp彩8?0k|/8]m aa&#y^\]vjF@wq屿Ƥvthʈew;uPݱVmOh¦el+ eW]L2Yq6ne1]SjqS}qa Ψ>X͌S郙c&s'V5:BIT'_=|{ sSNڀ$jFJm}bR ThP1fq{Lڤ.5)OMO?? 7.]-5M HtcW#M =A?hʩ߅a8Tߴ[A(ԗ5;kCO09v h,8P}WkM?¶b?UZ XJ֌tng)0\87jgo;97;Ne-?fg?{ѫEd߭OG;U )V ݕԻ ٢&VR'~Ro= E+Uop+BN ZN`@ԗ%";@Qs)cJӒ GzC,;'WE&B/xꪘg%dUdzC7T]1G7Х2"a)Ev . D2z`=^zA LGg]ӟ|8[h(yΥKҀ`g&睿D)V?".6Z86ZYkΚ#_EƩ=Qѡ{.Ae# SṰD9po?w '/n(#*tВLR zYI IIT8 &Q#ILȤjS.~gZQa~2ٝL)2&z(5f-I%*Y:9^31̓uw{dT.xCPTz :y-F5SQR&ˁ ;4%,pĺpor٬Yoci:CiGx,\ok9ir%tc?3m[΃IRģ]T2)Ra}^Q|e,u#4L ǧY\{Q/Ĝ{ڸwGNS|ѧΌvi7GF{ol 1h9/pEԤM6/o;zw{vh$֙oW;kHN+n+㒬MQոL%Ícl`bE%꿾z2QrܼVL'PSL@Su~{Pԡcc+C+9q$`)g"(LeP!, )):0¬YDMlTY+ƴϻʶD ƮvlREt\CT]@Æ_ZjM@CH~gU%M`Mzy3)(b~ְ>萅,D%SZ|m'*&GK>F{cw* bi@.}&RJas@ aQ^yTЯlH >[EG[yq]3(ʞDK}tm*yui~P7N[߷qD=N|Xᣲ͊0v'қbHʹmnH1AB;K7Kfzˏ3>N+|ȥdf9jB)q} UA[,3 tpg,Ýffbkk ]ҡ]F™91MK WѰ変ʓ,Ў9KLV,IOW8 -MR * yRs]]/aZ_ɱқh>(D(\)eo9K a>v^d0k?םF?j5p*;$:K_1HRS\kt #Jwb2Gq ;sfi' =reҙLL:FS| tڈyNڮH[*UIJC {ylS(%> .Å}E @!sY1d0c1Vd9|@S ?<0-fꜻE qyUz ;OD s \]]P79x]Qw>J5Jy/.]8޶rn8՘T-Bt+޽1 :u!*\ͭoV`9d#j]:ihN?|wj`n):! c}zڙljgL%'=y&Ic,p 괬Js_D׷\ٖ2RZ?Fˮ桭_`*\?>I|U*VD?WY괢2qmݣȄ/wxp04I8&ػ'%5 Zq W(Zɼq7b0qoeHꊤaV)(ygǫ׷J;[<*NxvgcN6^. ]xgM+JcJASc* .vR{,Yϯ8vMv@$!G6@eo@BQ']DZ?\Zb0m 2hk;u&VBq [BAu&\، XTnn893W/S Bq['Y~by` Aym  ͹ÀLg;8y`q~u :{fs&+Gbs]_JcҩU]z_ Y.8\:+)܎7aLj/OuiZQ=,n\$O"v' 9?Ǝm:jZ#yG+u9&Kb%rUp7r3K<4=x:MC/*TyC+T>lio~P\4DZt\,]yZ&Wt1Wˋjj7D'e}Gi׷R;ɼ ɒ[q 2Ӳ_Aݨ͐(HuMЫ}| 15i#AspĉcoHpijGC-40|w35' =>ϊRP=xU klnÈLpMáwҘN v69-j MYm.A]p([ ݐ8/@l--H&ZLN&?GJ@@@@@Ʉ,5en^/K^7ﰵ|)vT`ut撦Lq \h y5뭯=qͷ(yCjF_)zlz[*HS,š+cbM{VeJkWi?gϩG&d@ kGEWi9]Lm}F@(Ok_/[I>X3DX1W3 zƾ98O;wSZ~ȥUrC䙩o5{we}՞_ygM\5\!?Qӈi։эF|(m~zTտiœ67oSK e)#l6߸m^wU؍r +?osKL_py#xMF/ ;Ԍ+B]^٣)#bNфC0A.)ZcGFb ь&$7x?k. Ri'[eGnl&Q I}5ϼGJ֌tng)0\8_Th~`ɜ K5iu?ZQ>}I#:P1S1P?npyZI  ꏘ }[Ű+&w m%k_Dܮ|[RsEU3c:(c;-:_q:3`6a:poffL xU񆉇=x<mh|F] j ONȓo-wZ;u4:N'3O9N܄@}.2!/iTe2(F{h ]-0ەGpxĨR ^☳xls6#K}gbѷ>-~ d5{U8Y LUtx]y%|dx4uZZSo.L3*"I]px\-PQDBH^ϟckimF`nd@$K `X;#2E>Fˡ^cgNL]g~?_(_rZ+~tӼBeN};t1i~\(J0;b (Q2<S*fO/bЖLlH)4x@NzZ*;s43-V(.}qkdƬʮ6{MaULLHx]hT{ӽvv kbe1Pˏc }.v ۓl90đ>YE4SO-X?o`!!H9$gݞ7gW´MQո 9/z)O$~\fi{x&Կskyh]u= %Zuw{㤿hAeR蒄IRģygS(2Daե{>ָ-fQpR[u(P/,u1^IsoDdM]ŗ#vA$"/Y8ix陖$h]i%,pĺGl9 F_k&ǐ>-D,WfX.T0ihcpӱ2(w C=GqRͶlv@|qi,LTq 5G>-aPJ%6@sTb rvlpXez`2ɈJ.ݬ7'ڳ2LPT+\x¢0sA@3.ݕ6le z6@̗sKKcbhG& Kֶq-0m#*^R\懺#iFFgu-s:7l6}T/ΞGs7N'}é9GsVާF4n(BT2-b2M(zD&K¢:2TЯlH >[EᲲ-1yYaqwʺf//7+jڝHoviׇz>ͷ!mjVS:ju fȱn".>W\Ի ƆDȍG @lki]]|\-?pJk@]Pvf" +d0,M5 5UDrzPkӳZ;iQRN8j2y5kTXxiĒۍ+JG snB|>gr&l7Ze”{%ǂt9,7.-~4Ryš$TQuo-dyviѧ9r~\,ۚuݵ:1VNkŏ>}Z-8I ɥ Q Y8,e2Lk&U&]:h= j';Uy'ڇ 1E NM[PJ7<}5mp*q'&!Ѹ'[B>0CFKߩߩIcY׭AC<`-7ߩz(jyÏkIuZу|Qd—s<8z@AJL\#?aMJV7vlV{RrtكE3 U٥ι[]W_u~]+JTӛ[o߬sR;Tx/GBX=벞+4qv&[F1\P+ޫ?qɉCyOuؿ;, b^W~6OnpRrRPGt:T *&ҝl]1?wxNf`uok+G>`dʣFRj.[|S"iCs7@2^s;o덥??aK)]A wFHp l $Lw}'LΖB@h~hP: Z۔@|ρ. ?K,w!/ 5w%OM_Yq<&m鞸_+pݠ6T{8S9]+F ۯ}rq@}2fS?{o եs}FXW}uUS~Qz 3H Jhy M1kߟԡ {n?W.y^-:kSF}ҮKՊh7`us$W/S Cq[,5Q}^g-4HtcdŃ64Ђ5Zz?:Vľygk/4TG[ו8 ZnjZ+czyoMy4U~s'ǂT*?U65a}% xÇ#'N~{D!xqlpL" hD2A@@@@@@"dEA ES뱣ߗ4@R=: Yjܠ6gW_Esך[}ʽxMA~c2]p`iڛrB1yyUߧ)s-C*!9ҔG?f] 26yoWӈk6͉C  99ϊ]ZpB`~2inqԁMEQU&5So> /k0AR5n=rӤsN}7nŒSOptX9:2;Z$i԰ᖜcz6 n7es}wͼAg).{mͽb~N2"LZy#jqS_dΊN ^PUɚt\'fN'~uՎO˺hX蟆7$KƲ|ujqԼVs]kOP>}~k_c"'λ-Pό)ZhCx4ζ8|X̔vދ ž1 w U_/l~G!7Nj$Q8$3?C!Z7]Uѱu=}ǖd"fI—QFt2NQQ~>vf:3 *yrאrjn?=DH*O0|D:tRɤPdJ)@2~3]M@6mV %,pĺpm4}[Yw;NVI5‹<Lep[.vmlجw ϒ%* B.=t*xHˮW'&*v6Foԇ׻۳~xG#y=|Y awe/?n҃dM]ŗvg٩syr\)d8V=ìZ^ >> |hhR6]<޾w=Z8lXΖCԽJUV^)fw$egu†޾q=Oҳ5Jkɞ>Be@&XN<=URJ~8>%a߹>Y4 ! 8*Y02 B7TO+WY^Z!>LpԂG+G]XQ8zgomu}4KsNusb"2q{Jo( U>}TM Ҳ!{A"M3gm@]}^d˙/_u"Tɰ=46ɮ6cG()'c/u˖! ^ cⰁWC3ٔ糵 sݘT):KTgoei7B򶳥')QQK!'o:R;y/ޱR;t>d) `wjʦ:Rc/Q(PƎn3Bt c`4nb.s'pF!W+8 v#se+W_W17I3@ Y\)3;(.mw,ui`/W{(b&Xc( hl( **+ҖeβѼ<{3wܹϒ謧?zhv}a=[pIi#{.|ɕ3%J%QJ ?r"?=w{aBʕR*ו|?\VZ.[Z$OV[S,+ ZD7FǗlqb]WnM^j{iSѝ].}8/ЊO-RVŧhɭb66z7w: )Q.V@GIfkWy vszx ?gn"Pw`ݭWa nۧ QF^uAwձ h}7O%n2 pBB "صR)ΰ8̴ ] ݲ}EE10΍j`I?ڸu:踥a SѶC&ZK T'}Kw5[ U'1f譣?'$Vp[n/ t-:r' 4ˣGÍG0:^8T޺&1bءU[]8X} Q\"iiaaof6D=WG5 +Oyթ$7%_kMG m7Om|K {+ u| U5n/ 8kk 9wIHHHٳx^1uŎ8i[ȗ?3V{>L$!!!>$$$L|` $$$$$$$9 !!!!!! n0rQanwtdw$!!!!!!A`B|xeKK[nHwS8`+޾}w<,1ugK W9h>_D!>i-o>LUXݡ7v7p䤥,wp65ƞ+Ȝ=$ңYvV|zA}Eǝy;к}ۈljVyH=h 5y/M I[= WFJtdjW6bmڇLܘtǏ~߇ީs&U鏆NxQMfi8l¯-4*Gr9qiK֋-иτd;/F&^11 6aNhYgG fOQVR`Յvl\qm}O坣SJ71:7dm(B0P~uqYPoy)WK\ `L`ZܫW[u}|qg їOό]K==2j:CQY;[šunE/#B26`S&}{/Orn9y-Ӈ]X,@(F1K~@7FFl:tc|?K8F=}g.ѩszU'\X$Xt%Єʄ.Z<8ӓ^wPYP=~Cq_յ) VshLX@]w؇]7Fϻ&äasf Ua~GWGK>k&pQIJ7{B-㰍ӟD3;]uh-B!AK_7quMkHJ"i4uQ"UL3"aܡj_c#5;gdD'cQݼNJ?[w݆@ }yYՍK5bĞ}U{uFeh,Ţ1㬷V翺o1k-خ3"J0&kʣm?k[8Ax7-!1i>~-R\ A {n6L,q?4S+_n(KLA{E sm=JuU"A穗x#Zˢv?e]ꈯLQ,NJCvmpd܆|.x8Ml(r'!vAfE J}Zܳm M}Q2k ̊\38b,*P3;Ym˱Z2ߎJEt!6;wp4Vq&Tf?=.' ?Y}\y~=>r H$ Oxpă j=~#i4#z 謲ȓiž}TTh}n`NNJ9uwוmz&dJ[RtBǥ*Ι ,_Ǜ8>ɧDXp_۾0zH:: v~8wVgש{#p@/_=c?&y="v-(kP'˝,K9{c|οT8ոt'TSItS['Ewl9I!;|rlţ..ZWAXV}Bx)W_:]!L# #QS<@.UVUIXsWp /FN'fNx0Zf:-Xcf+oT[Q Ǟv:>b6 R}Jt:KV&Cʔyo~~#i/4\u!nbrTj6 4"fLP^l6M[פl@e*Mo0Xplݳvsojzi`| @'\ڂDBtgFT.mYOw~'4`  xzJocuNdjkrݳ`Ц5LSVI ggt CrLĞ_k_))TGx}`ӘeH66 =TgP9V+^0UϏNu})ێ, OQ#v1nQO)܂=Zӥ?>6-oCLXLie*%WoUtz_7vCSܸIV ť,KR`和Zc7T{+&-qJu?m@`lMǍtxz򚯋& U1OkMS wgwAr{ibheehf뷶K^6pV몟NS#7b^U1?0p? #y NhbIS8*7s7лK> ~QF=z}-ʓstmyg;ĩ͔)E|v*HV0Yo)e<,ʻq͍F6p_%s+:&i8l#3]S&vח7F<^.m`X ˕J[N>IEҎhL0O) _XBs%Zb3m(;$S(q?|>`1؃ϟbu/^GMs0ݙqTƏk)*I.)"~Y>sFq%P I:\ƈٱ ccb?L8X5S5W%Pr%8 xZ9VzEaRK>CkAS3îUy(7v Bv$aQ螼RB.˺# `4;S5dxLw{ g͵DL(zX_ӓv fx&M,?+@.䙙%/9S:ImClizhoPTQt#nKS x_]+U>?mZA+?/s!y&"sԶѫWxPgh:l: ,g)}by)G_EҢ2*1Ü~l U,>[+PnFY lMFH^4aѹ1]-5@}yO, OC@Lu=Д G?-wwX0֧g(V|%?ᔼfuĮ͕JquGǹgmJ8uc,,s]unK3G1d@&@v{;_ &l*{!#G6.-ljoɒfpkY"|HUƒ{JTTD ۄ? V2 LE5 _oo4ǥQƝ' 4Ccr'}jh|n{!͆1ތj G 6''RU]3ҐV>@ 9wIHHHٳx^?!e3}:>Vt׳Nmky|I|i|4EBBBf !ƷX`@lV?9 !!!!ib^}2/ A&HHHHHHH>r0ABBBBBBA B`B|xeKK[nH T.0a ӃBow!on[d%,ekxuApKtnXse C}S?-8'#NA$rB=~ٍ(sVh镑%9yho?=數<:GN+t4jW6bmڇLܘ m1ZWjܟ9<ęnvb١>[to>Nh3m䟺Hwi[]zh"c{ve GVwhn2ᖜIKY 'l)Rqޞ~2pzX3~dzixnK+hşBnFeǢMOocPz[@[|voU;l?av\N\ڒ/F|4!/>΋WknL MoBnܷ37N"./1 ;l pŵ1?wN*iĘogn//3!sWpZm]tE2.psƊK2=}RT{[u9cDc^tވ=O" 7ף8ڔ94&,Í t3\M,Y[=vn0\CUìnj?ztkQm2`ϧ$M\q͌zͽz%0*=Y\F fN"5ũs%Fh YVjJP){Ih;름v*``U ,N}t̅@}C'`;Λ%{UVo :G[a#3^=]'q@~+0zׯ4)fK874Xp˱s_&WH@U]'XޒJw}(2H>}48S" eǿ}p񵉇+dUk=+ӳiqGQWmmUf~-R\ A {n6L,q~SEJp{v#QWg2̬50Y#6>Xb3hB苒^o333Zh+@fxp]yy?M+Nth]vo·VE%:\q^cO'qqBΰ{-ps⧽hE5~3C*_Amtm΃eKN{mVluLlAyb;-.On'l\܎[/~sbD@kM<-~!ף_RYeő'ӄ=;2<|J*dĦΠNOg0R46֩#fqJֲ._E;&B45C`2rJ氪JžpxRy7\u$ xʕ$ž1/b.^q*%].'"hV/vheGC<:~ڄ3 ²`Mwq 5z#ǰaau/2WO cHG*[\oUtͣi=#PlQF@_)!( LeM%e\mdCWt~w.+%bOɜb2(kj̻ \':~ 0Z`^-p9\͒>G.-4&Q9V+^0UϏIOQ#v1>sKQލ?cBRǏ5kA]_ = vmZ345$hm:68O aq LYfDkޖt'~B+t1 Kz1X. p~qU'oko6-ֿ(_ ?J 8s=n6\3~?eYhdgĪ)y-.eUXv`N/WbTyNGP+f7*:Ufi4csrK$Y5НVg\֩= NR>SRluD\+EZiXVZ QW w=;/!/7-` w^cd[[+xwڗf,M} IugQW -t;*E2Iq $^]*pc^k%s~ޅH^ɲ ޹”XUGC-{mV@w@ŏF{hFls<u@ݞ"~SwRy.\Z~[.j]guG_F~Pw1'L`?zӆs@r}}+JiDTDW68}aQpba%f$Zo3ň>ɿfkWy vs|瀳0uǭQG^1i3{XFYdvm a6z~ MP+*qxx9|tnLWg{nՖb [wuM8is;\,~ft;ΦZl Zղ%ZSGLs1F7{k\[ŏf/}Qqv Zu*Qgw@@}G5 %{nW1`4.J ><#CWњb-x7D}=[zoYr9 m73Jah6_{3;n$5|;g]Of-!5~9&N={ߏI~F| $4EnMBBBBBBA L|` $$$$$$$9 !!!!!!  e0!KI^><2ȥ-7M;NC_尅q7EHy^]r?栭{}[3RVy4)/>΋WknL MoBnD :v_i~ۃ;Gtuy4ob7γ 7TK-rjE^ ? <5@]w؇]7Fϻz>/,=(~@q[3w֍F(T֊S#q(Fз^bG-,ez8.$f[<)B5"r擭StPnWxMVq,_#f{pid`ĦJC7ĊkD<kDUsa`ѕ@KRD7sV[ mYHLӑkFp54gEoڝC'`;Λ%{UVGWGU}æ<r_%/s!.r1(F1K~@F$A&+0c s<~U<^ `,Sc)`8I4UV%M_-~ 'ĩ57&$%hZE%-tgXE^ 0_P0x &}yYՍK5bĞ}UC89I @La*1@SS#^pb 8[m?k[8Ax7lb?LBZ[:$-;K[Y<*_/]~tEBiPtQoJi|hBOH}Q {ܔqu2⛛xw7 4EUٺ+ zxc~֢k 'YS#ǘhfF-=v7jarlML©ءAƮƷs:r@Q翺o1k-خ3"JCePވj ,oWcs.R`jeeWgmһ_4BgBiEj=겐yT_qYbM[e`a۠`{u͸h**Ɉ,aoIu>SSGgJ$V<.6pj}{$Ki"rQ&%"2E\t[v.¨|)̬50Y#6>Xb3̍4% =-tܳc&(՘BzL5-͋{t2#JԤt[4lgݖGm'64.QdYPD+(nDHPy,H>QG ?^É&pqBΰ{-py0-'+S7D/:`Kn 3;Ym˱Z2ߎъxRV:~zD]Ov{wϯ7\?..3\;ea9!8mbD@kM<-:BAI*+<&هMIۇɔ2N\4ÅKU2bN}"nxcp0aoͨrJ氪JžpxR2\1c,{mh7/^`]F=4#:O:_{kWTʶ+9gcƳzν/Ey7>Clֺ?=p ar!&,A &pe})iܲLZ#:AUJn%T5u߃srK$Y5Vg^PyYi547#Q| J::r{Y\#%0̝e8&MKS8l_~17!cX 02#ج}u*Oҵ2-B-45͌c{lЌضMmoYP ,K#zA@= #yw x1{FGd܍YN|c*b1Q̫ &(Te`֖bsͶ?>/(iPvk0݆ BSjM@,7̣A+Wkk$:t#.+o\6K,֧6^+jIy˕JOXuz{4`twdSRKfXƂR-WQ0TUMipBPZ+05OC=y-Ve|4U`م/r&D x$:@)4sM$Y~tWfB]{33??Keok{>\*Z5͞!d݂Yo]/*Z*r*0",yABOKꋣjEsy{. Sc(/&{h<& B䕪@rY}Q339 !;Suf۷bmO+_T7(={Cj7%x?r"?=w{a N`=N1iE<@ntuR jk"◅?w"f]-)׉~P o3zك)^z!e^έZ NhE㧖g)[ ώ8}~Xp٧9j^ Z34̫޿Z^)}זgXO2, N,܌_mQt|h\6_2[@ k;ݕ;n:Lx?+ ezˣ˝^궟ǃ:Ca+F$|/8CZe!SEGNʓ%K⻚]mgO.Y^о"yGt7iłd\Z;rd&z r5o̗ᦦ=Ԭfʮ3GAx=r2/Ǚ)@Uc06r|w'¹NЭօ/S{wt@y.I|tBj\:EXc66;wDXzy4Wu8xJ1d+'T !hBHZuZF%ussہ *"]+ 뎎sLЕmmdJxpBsaZϚՊ~6i2V0~\iyr'}jh|n{!!.qJ:pN-i6_{3;n$5|;UwK~i? 9wIHHHٳx^\^3gԖ=z s_&y3Do gz ɿr0ABBB7ʏm '9 !!!i(&]- !i'Ȭ$$$$$$$9 !!!!!!  A !!!xڲ'g3#:l?oBKR ryi iFw9lazp\yKc|luؕ/M"xuApKtoi&HY= o=zOb[9-WtP x朢Fh[?7n^ӂ]2bt:J"!>4Lp? m1ujS ޞ~2pz昨-=iNnn\|~@ǽ<߭}sth(Gw0>Cpj,Po6C%^(Zރ^m:t~ƺ#YWe|FFl:tc|?K8F 拃>Ld|xf\\Sēs.N-A8Ն@#kSz И(7*Pi+{R쨅e>LOǥV5 >vgpkRWoej3lmJF0J_tؿXr-~ ?HGy:WurυEEWM(Lk{J`6a}u9cDc^tވ=O" :6tς{- tCmA]/-AL;hSf^M=I]ӹ.ۊA4u-"UL3"a@vl-or6lWTVƥxy}1bϾ!b҂b6Py6F3$e 6dv_G"u[:2*Z=(!2~ʠX4dPt\wCu\+3>=|yUu)&,&xvuF:Вcmzߒq,7`}q&݉/td`xBzZ~mzq:ôS/m3V%wG07]g/57]yyE[JG/?ҧ]fSeҖTgߚ7L)Y{TJĝKU2bN}^o؆G81 "bVpQ6☌Gg`NJùEr\7 d8t).μ}}ºnU'EzI|X=H1[ 37ARw,7f/<}GUؙƔ!\PgĀnІ.nj`(yOT5B[&k%sfK%\mdCWtfw<&$E9~XU/|zow`{(F,c0d[4u/-9U5 i=,mg޳&ƙ dJo^ =B6h { \':~ 0)#:zP8\s9 Zzw-=1YR!a.3aJ^Ke|5 ;o5u͛O$*46ܸIV %=s[5jKSRy XVZ ͍Hꂒ'qlγ7^H 苌9߇suzxuk.J0T)ɦ(xa =kʹFQZP8`Z)W0Pg>iaSA.W+Pb>^%8x5́*—\9_^Uа2<>{T~}}7O6Y^xFxJ-|'K_ܕv$T^'}C)cFZdG,Er55QTQt#nKS x_FMj+LzXcҊyN@1IX'T򼴐˲CZ1bvsr9xP O;쾰-{z2n<8G.B,G #r '05jiIiL`sHj7~f?,*WԖW^ʮ׮˧>yafL3s;XCvʏtW8 ŻH4ݳ(gf~~cܩdui1w7djڣ"qS˳q0,lԤRa>L`?zӆ"~Mr ZjLKGc2pڕqނ?d\;-94 `quQEL {x5P.?ؗmU<[1z'{n/ t-:r'T|wmwqQ\_?-A Eņ`SX"QATPAPѨR²ly^}w4/t=sϝ{f=\"c\\=~߳%^Q/5q+sE"aj=us*C'kKs5GeνuDyIZ6ٰ a;ɽxuO8w:)}ڈyD),߸=47 ?|۲f?2KjK총1l \4~t޲ A]^A,gq7c9,VD%?RV"ep|ahCb#vT8m3*xfc%cS9 QpȔ2=K-w9l5$/Y,lϲq;-C@C=ਤFȐ}~Y~ZDM$!$&ր8DvHzDIG?#:6'§L:QCrS3ENY 2 !!!!!!id2ABBBBBB*dU I VA&$$$$m[OP{$$",>badiy2yYs;0"zߣ:[alslȢj s6gJfhVmcG즯rҗ{i҈*jF↳}\wuCS^iDIb5sfTGC; H]>x)ܯ^6DGt;5T_vxv-+s ˏ1c@o2x쯹VT{?zH FwRasVQGr妷~cfhvgi;WwUb fmwFɃE!j纰E69W3Z|kr7 q2fDڮ!ygw-3]'*M_ԧ$d3?8j;?7"`Ψg5*\wwޮ? Q޹ =}{?gw׻oB|KVm YUaw={yNוT-8xzw5@%G(M&$[n>zNکYWqgA'Y bM'2^8^.62N;]sQ>)!ֈj-C^GW-p`Q MzNUAQUT܏q 44?JhjGQ3z=.\]1zP *3ff91%jകE{}XeNKMWeldžsK4Q&;׼Ή]%>°L ;Fj{SsDFwkAT5qq?mϺVֽ1J7Δӟ7~&w/Q$[όǷ8BB^eRN>O*^FԹ9Gk}:Qu }B_OaR>.VpECI% uhQE%,!ñKm]ϏMIHZ3 -4b'th\qwN;~!f-c]3>* YޙGsw_2N6#Ҙ,Ec1EŸZlæY9ǽ`"<P~P:lcX_ǜO-yu}3z`2~ <̨%:e@quҬ3 =PTbј uTzTةl4 P^qlS*,I UBjYw%>wh{z:[jf."|F 뼉v]4_NokI#뻶'B BPy< e9 ?(}z+(o͗zn}76AhT O{t#7|@32$7GB1ʒ̪*c=Rӽz^C+,B^ڙS@*Kb/t{׵{.UR9 t#\-}Ka^U6gr4)l(KʸTa84.@nz4C7 \lBZz./+kmѼ'Bgg%xyez< N9E2˳P:,&Y\bO.d} 5COsPG>`eGGu>lޯa Xnfu Ψơ*a<7 )bȗ\|r^3 wgyka[P>^[n[UǤgs*(\%K2 ^=эPuUIa%.)e O5tGnayEU+P;!xHZtViQ_W_(lX 7WnMzvciS0L 466xjM!MEr1Q&_xp>𩇅D$W3GҦ25D|uw64zUa7Piel5Yr=ۡZ{*]Y,,ܬϾVmu_`ȲDC:V/6vX Nq*;Y1cÞ ~I\QZwα']sNϛWj)i^٪zcA.}AF7FF;vZʔhvD' mf#,ea9{Lvr7h^Z[.;[(Ei#q\`5KVi=|CR8>סGpf _,|jIVJ-/UTBe( Hu|l4俇8GuD.s S4540f,9͕lP{sѦIg)΃\\39e3;qtL9P?E̺pbU%1kM1 @;' 0\1qڑqGɼfg*);:/g:^x{3tTː؍ځFb˗N?ɷLVQ ޛs!e>7$vCвʾ0ddH> z:ߑ+Z"y̮DVBTKC՘cYBN ʴ8&JOZn>-MgrO hop=IVs)JӣE~2;+6BMj)Nzxi\_g\d 'suA|Qڋc,; iP(G`;mCEt|b_ ң |LbHY{vvc/,Y㮕]Y4 ds93> 4CUixn+H cZ=/?*E< vs?2Q^Jĉe/̻rّFwOb b36Ba؆l-=%WUln;}x"yugy&wv_{qf)A3+L y_\:ir4LҩbuwDe T‡ D!Њߞ_y*,d#Wnб?Z.پ x+K gĵu鱷֟{1B2|0Ρ'FD .>|J3}{ *<^jׯ_GÂOTg*hljnQPubUQ2;}{u;ǜ>d(*(dď0'׽r!;uo&9YR@غ"t IDATĪ*T8K~XyRqNkSÇN(o/f/*֖U\ƫPq?mMKr?s4y˔ښWwݤwn&i00qJ1 4iĵº ) x+h ]Qtrپ#+G~叉9N$B*$ !I#C/ʒ~mi/~:'~$Wg?.'1-uW.M0o[{Oh|l[;1աƫ>fy?N\v)tSG;*0}6]캿:C W֐d8&>XȧU_v?M>8c8/hOap L1f1Վ~\qY]TXS-؎ݖ߭u7I(L.Np]%9x2:qsߎt>sFԣP S2`z >D =X!=65>QpWC=5q+sE"aj=u4oNFzTENT#e%RM6$MP&c;!Ǫ-S% Mpܡjp_mLYeK0{i/pѳ٫3*0?S  O$$D50vG%5B㩗ʋS, 0!Mq6؍Wg?.F8"Q35-GWG_]9q"|ʔ ny1m|kDf_ŋ%@_?c*c$$$$$_m$m$$$$$$$L&HHHHHHHZL 2 !!!!!!id2ABBBBBB*dUH&ĩ)X{l"jZM^2\ F>^U7ؗfš}aΦ̜U_Lx$`[fNTԛo CCL-=Qb}J~A<6~Ń:մLOfh.{yUU/>}l<f`X~-4ƷηR T{?zH FwRUc0 gl[%qdMrm6]L(S߷ßIco-& knGr妷b'^s-96mݝ֪9.TVN]fey4n<. ]ɃEn5p:4J%~ЂUG,l*NcS3=U=y}6GVeTts LH|67颉0YWn @wv^=򢫹/9{+cv5\zymoeR;ٿJ>:v픃jDz}f X86y62W gā{'GmrIr /2)OxR;7b΅Yo U=9Y@V][eܰZv&X,#x7qŔ?46'BQ^5Pܧ]8'j"Az͝57bES=K#'0%!OO^M934~AՐ^$њy [ _K ڋ;'v}(P( >Dspe7FXQPM v~,3N>?]02>%EiRAoSi$ LEb]ߏv^I:o.,Z?^Q%ϴg+ Z0Kor-b\ò#/Λ?0/QւQY1L4.XM;OwUmU YޙGsw_2N9:o]Wk=L-y\m3K$$T|p|[3\OҽUt}gLJ]ۓޜ[SͿz ՗_L*tk*-pC-rl;7Ţ5~ j=Q]Z8)*,H7~Vl;s6L4Ohmc񾆒7(t;T:')m/@f0ϐCAt]̄TAg/A6=NZj(_AX.}<8<9X~QhPiTjaӗ(7bR(hZZsYm4=縗.maᱯEi>ݜ>@Zst 5]Eva'Ʈ ÚVDYTfVUПEsv1g+^We\en`E*_NNkf=᮹,o5z>:y Eo%ch^!ϳ#mn [֯|JOi(MJE<3g_]kUzY%eM6mU6\[>6¬tLn7~5|xFD$WYGx {|0J#b yF3QF}ͽ/97Fiw4Vt' 4]947\0t`㿲cH[cIQv 88Ub P |NtXSޟ[~{Ic=IN\Jk :0i>dsܴ{0QzԺR_dRUGRcG#:۽ߣX xչ pj1 ϴނ 9{&Tẍ;2D@qPLc@sq5o+t2٘0rc9~%nӧX]ʳ}pVjodaTJdLJpc/S^kkj^uޥsuZ`8Bc=)Drqz0J;$_;J;+&x7-Y hٶ>wcCWS}bC>._v^wԼ vC`S[ :FO??w:cm2q'H%^Qo S]%9x2:qfK}r=ykUz_Czl*GuY# w2# SX()fuq{hnl'HR\4՜Z %'8f'F/uT}Ui{ +OȀ1V*^W&neH3L\}`a> ,Ni#Wrh:RfTP%F9NDŽ5$/Y,lϲq;6_aԩ/yW;M&]k QIA!8ȤLN?ϡmc :&_@Xۆ _vg?;#Z;$_=HupD$f@_h :-'§L:W>5+y&m>w`gέ?2* rS3HHHHH\=a@k߃;ϢP\ʒ-d2ABBB?bfPtY|#k 2 !!!!!!id2ABBBBBB*dU IPLSSy0 xEԴ£,drYUK|R_o= iwx_`>3=Ek[iM;||/ǝM?UM$&l|-|4wfLn|g?=SNRcl6併T/ o^'9u5둽\d]v_mj/([๏DP;;?(#|^.*)]TR:k7^^jvǮ(Q)!ֈj-kasJ*;""A~SUPԴM#š|fѾhmqj1q>3sLVNxQ"ЩȻ#Zup3#Z۩5M6իGrpt/6ԯI?TE,lŴs\F/6|Sn/KvZhļU/c;6[zȐjgz]2c5t{WCqi?I֖"y4yRYI32~py~OUЌ^kET5q) LC/,,^t}уo6%&J-uyR7z9Z !3c-N#62iPg@EwN쪦 SMuqP7?Q?Ubi/WeɄaFTeFL. #.a@iӝdQY,*I7 YޙGsw_2N6#Ҙ,Ec1ƅKӷ6d˪k k"M=!Ϋ~x' jϢ2eB74Т -̶hrjwmOb@hԦbј oQ&pq i*Fe:]g7:nx,NxV Ydh9vP?CuqffIA7į̆24_ >YNVGB(Ʀ} %(K6q?F{r8s\mVvg1)2uq,9\D"hR|p|[3\OҽU^!뼉v]w{Yat^ :=@eP? rġ&z-J@֋;0>("oNDY2QYUe̷GJCZk{o\Bwܔ'PʒnuޅfUT{rB"-8v>@aĈ<9̸Oh(MJE<< \#)n [OgS>^[zQ-Kxw'ZDL++u\QpQ5.YQtg=*U}TexJdqU?M, :.YbWpyYAd|}g_kQU#Zv35| tjx{]sYJ GQV).eI*||EmSpqVtّXG8T*?{=9T>w$!s6^/UZW 6*C  q:v̱E'bR(217 6ĩ=msO<8somB JtҰY77Sw42idw eN"zz ]H柢?O7N˩iE?mfS`uk|>J=X07wXڬa+dl:], .TRi9Nt̘Ű=ły/JjU`YXY}s9hŏ"aI.?e{{#zڸ8x^|c2uot3ijwYƭϙ-`;ڪuy؁B .LQbeqqtVC>Gozq;Ǟt=~;"w<'QiD?bWKʩh%*Jebs=Qa 6?"]4߳6fˍ7G m:WS:)grfvt:aFO;أ/" ]3vz5UCpLeq(2a-aʅ]5nͯlXLyuq--]ЍŌmח.n ?T8I&ցWOm6"?\_@tI:aReM=fJF9HN p?v@@vdQc2ٙJʎ΋μLÛZ?ԾN?0瘛7~t \].[%0q0eGFms=51j!4]Yrogp}cӚyg҉WǥO/p^4>eUGV$=w6$*<)N#P]GWp(GY:hTKqBӒ`X8En55Scܵ]:>C,W"{\E<#~eUɣdeqYƅ_9[t;\O\.&~PLAt'RU{@(s8-q>zUR $$i%.N~T3IMm)$R*dP<ȮI |֝c9~%nӧX]ʳ}pVzD^[txWں[O=!.u~#I"TZ$JK\|c}8gA%T$ &G%`Β#+%h˂#9+h ]Qtrپ#+GQJk%LBT\v33'HQJ`O{sݛXCvuLr| 9Z2eD9 ;zn.4 -=}Ed, uT]&Kw⤤:QVX~uA0>eiQbTJdLJ<^jׯ_GÂOGoezMn\+e`tA<Վ~\mϢ좪c(׃ו[+ Wi'ǯDk)k/4Fc=_ euO 7zG%5B㬞޶IzDÌ$$$$sD)>^'ȒYSO!"%i31Leֿ쓐@t˄VWIH4J`ukߵۿ-냼3ABBBBBB*dU I VA&$$$$-ϵc_Czat-<4 ._Ʉ85e {ϘWDMB!w߈K}f,۝ZzOxM0g}fNa{.i=%EH{>yevηR0Ą7㺛o2_䒿x0QgԳuv+3?0xmv  {r[1v׈V.,BجgbDET3Dm7{PH3p7o?=xa;m:QQvco-& kn&S 2l!qMLϮގjo3iwb7kK/"IFM۸~ufz2p6Z-XuȢOS!4J!^}a1`+mR$Z35o!psKk<0yіI}`{2ع9s.P@C?uzgGX}(KL࢈9?V2#(Eزѝ0kYO "8g»O~/z(U 8mCbێۂ-F? eɄaFTeFL0ePh9@K-!P1eҸ]:6{gxKF<~׉HC# Et1-FehZn:iӿwgr9xvp|]ߟs L*tk*-pC[NG*b5dNYN6$3讣4TyDǥPh4 t(Nkqpt w@f0ϐCAyZhҦx*f U<hMZ|tYB@`kӨ'7u_`#ScGUS(̦~~vݲ/] a"< *+1 fzz~wA{~eu֥,e} rWgqy%2|s1\?6'EYTfVUПEsvKU)TګٽZw~=<,v]]hVKښҤTó"7تMi к1Q8.}^1;4XC=wDzTR̻{h&j9ضV/:,&Y\bO.d} hne^c_q߼v pz)E/x,vY.eX)mwXHq@7gⱛnՅ:\^V_ڄAk2q `S@E%~|\٫)E@<ўi'B$(Svf7[cos|Y4zҢ<; aS"1NrLӏJ|>pC=\21㩗L"XP)xe 4$-3f6#:W^:i;vXMG w~1!q;Nu {GEֺ5#oH : 3g_]S`*6S[”jվGwA,SFyO?mkhsy”dYVyQAN}<| nOgϱK䬁h\-6@`i*2BcqF(3p㉼ 6bxA9MoFzJ=&ÂoRS:pT)kF\rYN\сx+]&q(ЬG),E&>CXgehg/Tr3PϢ:a?0v4fk./{V_Oaӫ &W6cdt S1䤯 c$,tA.{mq™~j Zt-5[} Y6{$oߗMPf3c8|bT. N9\_#ykG5&󚝩{퍞i蟶_So&k=?bVD ワ^Q sl7׿j_>>*u<ܒ._A?5I\HM]y,!t5/~O M@;0g)e in22ܣ.ܜܻxíNOO8za@?A&,~aޕ G7;Uiw4Vt) ` uw\"~1G͈ʎ`3Xeǐv?>ܼU5Or8TG U(4_ߞԽ7` EOr]u`q,K:l(GY`MjvjYޚM4AX74p$w _ވkWe i=sğ_O1pwpWw:0}6]캿:C/m),߸=47n42-ab+_2W$&N_׉֤ =l-^^oI(Qqi|X+h,-sW9 @@ KNqNރ_\jd>. Nt>K?8j p?[>I%^Q/ZNc1^w]2lt9\nX'eqOqx>,?|۲=m%bw+c E Ӫˡ=hm߉QIA!{oruB*2%`EI~2Uv>vMԎ$Ak#%1F!_#&!!9q"|ʔ nY{ xC)D׬:ly?1Le):V  xT{€v#L 'ɿLJ^^[u}i۩ߧ$ I[@&$$$$$$$L&HHHHHHHZL 2 !!!!!!i*Z Y"`Ӏ:T,WhҡՒvU[ s>1x5Aˮ{/SVXރ mw7#LeJmFlBeLLxkϼNyg}9 4 yg˜+nji\T?x*;}w{U CοnMi=/RX%&(k\S夯wĽZ|C3TJ=tE |v\|C.J{s7s?u&rٜ )A^vdKzT-2dZBa i]l/$9yNyNK?h߮t$iBhԆ&TzHeh*hx\m柖[;ﰨ.,E W" XQDEłĚDXb^+%HP,[[`YgΝ;;3v|% md¢ S|tլ͑-XbQM8- ]bomn%$'q@/Zz!G,x@&v:7w@z䜏#*FdEzp1zqi={Wf03#~.Gv0nߩ x1r_u\4jF0 d?㟭x=A T AqQ>`Hw_?rތ|i+/dEGsN2f%Ll?0PzK.4IIe _mxs1a^EW÷?2P̻fxu)/+neQb@elKC83cL6 B/Oͽ/UlDv}VGz6}jj꒧ X0D^#f_Ie,);{2"Zyn]8T]7y 6}}1:bX,mW!@0YҨ;V)r泷ژm7sf2 vtvd͆LjFc2oѨ?`[eY.h,&2ԩf3ԭ,<^~¬6F1ݭ2ʗb#Q:L4&VB(ci%9?폜ikq|go?ZT/Dň3mԇ,|P0l mM u7oG*;E>/Q-_j/<7;? 67Xɱ_tmFu z%^qXI4B ͬ}2ڐvAt/%+#Gt֌mQRi>1vd@uP^]7!rk!ԓ<Uf X|ɪ*:rm& HPx t{s+N:pѽcNōGǟDO"P<|sM&HUc~P:vKX ˁ+M0s91-m#ⓠp!,xUmۼbK-6} _QFX1u[wг }pU Tj h&=j wǟ ZfL:%ѫbZtL(;vq\8#eӔ3G4v 6 @b2qJ H0MzwCn|=) Koآ)L%rcSW{>Ko`6!#n,1`,3~0+L1kh|}Zkh-) | 4[ P 0G~L>anTN?3;Dz3 Ş7@4߯dHjk\p~??׉1G_unǥ``;E.' K,WG"jZq؟ }TQ%_jK4n**d2+*%e&:'f5!Mߑ)̪x`?3 IDATY jԔ@w`ddI@de]lZ'巟XO e^jIȆDL Moej7h/j{$Xc TeS\m`ci!1*WZ 0 \˯xtW^˓KG*~y%[&LW(*؋8k_Oz'nW-hJP?Cu#C;sSH+ ' 3t%9f]ۏ2/8+\O:[d>_B\,8 . oޠl\zوء/_u)cuL1b~=p5v D"\(&$B\$"埑. qaO| Rzx˛"iAÃɆ&JYogjK˯%aXU麘ڔ眽Z@(?'&@OYɓㄨ7i4]kSGNyI%xU^aIJ= ~*MS'/{8jfD?_Me׏$"QArJ7}jP cN5i{ˌs0Tj/K~,Ց#k8g8wnݒ5 px馾[2LRboΤ>r{!cz]NSb๾}/ R^;d_^ ?>^}A˖L r,( ~ܘ͉lu;@>A;OtI@/ ~E;^",&-;7HiѮo#Uq޵w^ŸO[+bt)[Y!@cip;Xb#C_'Y۱}Z/rܡaNy6DUA}E}c4,Z#VSYGSz( U5i}}T kkE:3F (]tĿfmaV/U#Zh@:>q/3O1π,6@ 6 @ m@  &@ L h(@ &P0@ M &isX^{ߴK:7=Ӯ"DyΩZpú٠du3N-ڟRf̴Co3'>x6mfNgRC_}lpX]jX:nhv 3$^ c>h>P;4Z:cߒ}$|6Кa:|(gg,kѨbkFT+6#ΙeF[Kc6^\ |Y~5OUP`DUvءA58@ݙHi}PQXS|[o7.}Ԧ3o/ @k#9|7drf2}˝XkWteSoDBH"fd¢ Sx N G;;=vqZgx;Inݘm|V~؅zYK}Oc:NѾzG̲B\Zo=(XZ9w N0Thqē.,p˗{RڏqTBGE1<]/+fr Kz_Sla&;iz;Xx\ó񡗶*M?WX"vl٦Tc?L>0U ZCq\4S~`Qi=sz} U*>Z{?l!gsg+I<Р.}aG},:{ZqlI0ސEQ+(sgɓ/KRXپdC1[]ȹܼ9^O~Pq#ՐLHf^(Z`e¤;dZy_g~|wgJTyn]8T]7y 6}N(.Ý4o>̊ Ȓ6`Ywsv'̶`ہpvBdVQc". XgP)Dah&^*Fx#< =\-Fdɠ`xzz+KڱiV=C#J$m؍cvpgB(ci%9o|QYS|>[yOxZ&24*厕n-]?TJQ>m,<12dKj ;K ~ANV=M +=Em_ikq|go?Zw@ ڀ`Me=VrĨ<]'xQ-%blPFbRtWNtUfuy= o5w !s-_IϨ#%nw1ŇbӾ=Z~!es*rk~=EQf=:p^MY!ϸ"|,.BXi?Uz~_U߈/c~M4$a?T9'Ȁ\NܮkŨ.}fG=Q*{_3;瓂A,L7=MR߾4îYϊk>m~ݼ@YϗURy"ՇM% 0έN[b @c3koL6]=KsPmu~ $#.4juSW[G?b=9AluwDVyTV{4o-OQHns39@RzEW6{r5no|ROpDdU9RjHN֋$(>KXDOX' 7)iܼ=A\ۀs9p *vC90Tm)_~qz̓܆֌iё230Go/u?ebcG vU:a Tc;m@m}jLJ,M_QھdSgZ 2G'A_NRo{P2 LS %b19 gl}ܡ9@d(}2͒nu(~|x$CR[{6uV%_2i̢MȈKiՂHBKpe}&>߰EU_pl7:|J#.}aGMҡkj M ,w>gO#7Rgg:1TTj19ʬ_{'yXI3+Blo{'Z;0j2_lY54GE-YY)vlo29JD Nܮtqw5K ^$ \Oɼ-}&LGs$q"+1&˄p:Tjع_6>Ci->1c G#[AEz @32D6<v!2޼\KﷳZp5 2ZZ;9NP)_hlnSUd_'Y2g!bY!6ZJL(G-vS=y JzQMۗ}>'=w1U<]Fj &]ۏ2/8+\O:[d>_B\,8 . ʃ^ ixz> hء/_u)cu>qM:T^=H d}sv4La]^vH_ $g\x}Uz\AmM݋oȉ9p0U\Oj/_lqdU{BJด_T|b*{!qH D@ƹHZ`a`I(P/p|U S6KGgߤtM1Hݟ'Z;߯.?_'ڹNP<͑kEºnKhoӍդZ쨧>S ,v\Yz~$ =.5OP[]X{F%O+Xv#oh% ?vrNw|!5l+YNl)ROcW&yu8euc6)JRc(|Ivf@+o@m6_ XUuͰ-\f4"DsN 8qܗu'g@tE@N@ D@@ 6 @ m@  &@ L h(@ &9^G,M{DooRRzhviW8oN{mzMMlhw'LYXْ-te?db@n:mm=S_Xg#{`Īfe o0qC[p>'jM}i4 swMVa)ޏ@kfp@kFGVS{a)wmڬ?m}ҏN_〨u1Ս+N=f6{SsB;K=\Xl!={utK336Iq\4j2)7wo&qfPcM8?w1JQZ3*w2+)djf!:'^7uyE%P)_A/eA(q션5~j"d5- Y Ltq]L "@3 u/q0pj:| ˒$ ?/3׭ 6oFQ89!<12dKj ;ˏRTbј u~g)Dahf1)6_l;Xivd*Fd1 xzz+KڱiV=C#Jx}t8,uU}[/FerzOm<=-j{15OiPl4KFܱrMn_O˫HFk)UeiV™Q*{_3;{ 3[[iPuJ{axNE@yѷ(6*6ț;Tt\Q%NTL7@0_,GÐg\Tz^%fkmfGgΚbh4zhҗE>-JxtQr㇊:xi[yYVQknPm37eYmJ0wce3=G%Հ<0[0Jlr*_*B * Ef[ƾDYћ[K4NK@*)q0)Tǩ1P%_`k3Q1_acѷtRO[3*'*Cԋ끮ɪO8w.73sBaڅ6Ri>1nL"w4EnL''yUYNݞ܊\tSq ѓhyjǠ~6W1MdvSVj6Uߩ*EDŽcwɅ3R>Mn[s%rNyFcHLW&\ d Ig+mE\SKu/@8|snxb]ߔϹnROog7/N'H:R0lˢg䩙}νm f 'fv -eg,>=%nBCeM54| 4[ PUSTSԢ;+G:+(x'fR&HaLXxpÖxzByP4D 6 [MȈKiՂHBKp2>u۠5 L=-э<X*,աC߭:f1,zOG2 7T\}u)1A Z Uf^-;qԋY zVzd6. ,m[rC¼&Ybx馾[2LRbJޯ@233l].0z߅ :%i IBdueOzzueb$ìͤcW("Oy1cIFf9qK?%QU;||4t)%]{-1"V[X4DΓz;?r:]i8_ѬΆH3 F{kT*!qk~>i/tǦ͚lvON\쫁'o][L\r:x}Mh %ql쾠K/>ByGZUTLi7tDش,A‚֏^91Mrㅌ>C^&?^:+@- qz_8Xme0!:ۺ~?N 0t<jHk6v[=PhuG@ 9u*|q_LDm1π,@ D@@ 6 @ m@  &@ L h(@ &9^G,M{DoORzhvtWhw'LYXlK3q,u4Z}[W1 v s74[d}m͇qvBڟYْ-eɪqkYo'}:P9Qoms(\?;4Z:cߒTWہV ī5afvhBݙH-Z:cٞ^#ӕo2Zbv=:9#Ve47"y_O=FlvdCV=l3[c˙ʔH,O9V,D[+-գsc7a 3gIuKWPfA?Mv5rO#ސEA&:P2:uJOUG}PCcf֗dZt E4KdEzp1'*Ʊ6gqe lI߽xl[ x k'Df@6AҊe:;r9Jiaռ~|ҥY>TJ&LFܱrMa`L?B@7^EfEѨlCNi޿'÷@mWo9=BW=M`Me=VrĨ<]'xQ-#qF~2g56c yYb]8aO[ <=<]OU߈/cI-}{b MY!ϸ"|,.B$sX_ǡCs33T?J xqns /yԡg vg=+U؋es*r-A?t. nqnӽMH}mY?f췶Ӡ-Z}}㇊:(;n2:RRF}?N=/^}[\t "2// :0D*+83: ʟspp@c3koL6]=KJ qX,qm&ϣܻ 4֠yWl|Ŧn{{gb~z%R&ȑR[Et^, AG~Su^Lvv230R#i)ѳv2apu1_%1%ӎ*:f X?; sD|C`suy;"HWyMi?=uF?{ijScRbnJ>7f[@0'p9.Gc tnHH>YnQmu~ $#.TTak3Q1_acѷtB8`ԢcBر{L;)[`dOX6fZR(cv(lpte̕@`tj_'ɐ$>?~諵 l}z)v0+L khh4hѩ |iL#ɽ9UnՃe_B\,8 .  SyMjPJ/kԔWH-x4  QMͣoh֦7N._^_JʖT$ą?"x\JoyA$-}x000D zeWf*jNSMH>"/dGJด_T|bU=_r,+Xv#T?Խ6CLb$ R$j2i4<|tS߈-cKg^;5lN&z1.\p')NKo\MJ +SBv=18Ĭ|CT(MbNy6D[yDΓz;?r:]i8_ѬΆH3 Fomriuzt/eV7+EO2 6,0vNNxvT =_ryr>$kpt;suO')/f,,'8OPu}7,^ki`4ɫñ-#ul|9HSYVK}YW,vqO2:L:=v=ʬ?@ -lDnCǸ'شYmnɉ}50kKN'/ M\ W0==XUuͰm[Tm-ќS'Nezw 4F]=7#h(@ &P0@ M`@ D@@ 6 @ mL*vHCw?䲤@ݍ@/%EŠqZ1L$*ߋ@  ;қEv@ 0h@ 6 @ m@  &//SRiB9(@ &P0@ M`@ DPK0AVZ7aYtc$[{+@ ?  rbH,e:t>SH]dYlOKGmEo򼩃 MUߴm'ˢk%ϢBH87o-؟&I1 Ft :EHuj|f^u2"qf~ele|ބMYx0 ͱp5"t .~tTD:cso Q"|ۆp[ƚʍ(3" kFBc{ִ7:1hU=_ J1,eH^ퟵC3]bk>ȖLj_zU?8p\z)ζ6#]t1ݷĭ7ՠk7xoO-29\ǁ!?v|U -l8~?oҼbiΞI(PtyA? ?u֋w $ˤBQ.צqr>+([h`%i]%ݏCZl9|Lkmxr5cy[A}U O~( $?U_t3gT&\֟40(⦵X^]C'dyBᬑ~0AV$lYĹ[jsR 5,h׆3 <(⚼'6i«kUz.mm{CMzHI;yM Mty,ص7$%$]c,(Q(m/:ZU{/cÅ-3;t|S_xj vHUcםXԅFT*bR00 ɒGyWw1xs굻E \FG7j!Di99+M0v1hvă:8ySZ3'`1޳#ri,GɎ,]ZZK & }f^?FFX5Q:y[j;sQpiÖ}g# .m^bo[͜[XA>x@{/6dԨ1ClZDYzFc[)*K_l݀:d0;S> z[kɣa?^~ԁw6QN?tl?Lm}$ KJr؟`ڗ?ڹH3nʙ+t(dsȒs,9-h̅;^X0fظYs/dj8wRm;qj뻣aKqqdɭo; wpr'ӛo,-(EVMSrT+﫩}zk&,a yKӮ kODgxy@ &Z۞1~ ~_Wzg  / Gm ,Gu6ͤ_wHLȐdՉuU f痎>ruӴߏ / L{Яgt5{K@ 6Z-ZA:|]NUD8[1u&z]ӭ6DsϭGjga BH߄8ܲaD ЍK7GMX63.Zfi M(S, E0=SSm {X/&6@R^t:;,:/R\m?\d{rcXf]~swL_?Egv\ўߢqr؞-+s'Hy4O ?L|nCm%eusDiϞk3 3"֭Ot\arg]o0uOg=K 5?22lϰ8e98_ϭbz}fT 6ZvunBܩ_ C~]WM+{Xs/(e] 8NύR)4< ]*~qKg16o7#ܩ5 ԰.&*fmQ@}%Yv=᤻i]/  tڄ 6VIDAT79>]>4C]a/OdoߠYYfA%_,~xp=kg;b ěNӏ)V}S\$$Aۜ2\eLkcGoϾ{s,VUi_}ť4ͩdeFBRnyNGoJz@#k__k†X>kރwvaew[̶-DAB+)HaCm$Dn80(#H#SLǒ`r)J`"쓽mC>f{s{9ι|&vϯϕlQ5( @48p@ƕ׆5$U==ZX mQtM1}{';z؟޻j.Q9/bdFרG{ <ѫե-C:0q{ M5Ue Hi:r N 8)TGӖPݸ|$[jX9 d&24S5sWhRfbԗUGo]Vg5cwuV>f?c ;LLMݚ./q`:2i MQ,>oRt@-Bi)RM趼onud1TlH GgML0Ak{d%qdU~S#ۖ5۪{={MN>\Y%ӣWP`pREVn߸Bg.{e朆J㱾UoLRpT0L|7,D}ik`xC8R\]_rngxRCڰ}Bd >4++FٳXtcPsJ%l¤~`nИn^/}Y8 &u "s:Jήվ!ܝ@l:X$B{FܷZO$S BLs ta!XB!@! p]xc.IENDB`tmp9balx013/cppcheck.sh0000755000175000017500000000063413616566001015050 0ustar carstencarsten#!/bin/bash CPPCHCK=`type -p cppcheck` if [ ! -f "$CPPCHCK" ]; then # not found exit echo "please install cppcheck and restart this script" exit 0 fi COUNT=$(cat /proc/cpuinfo | grep 'model name' | sed -e 's/.*: //' | wc -l) echo "number of detected CPUs =" $COUNT #cppcheck -j $COUNT --force --inline-suppr --enable=warning . 2>errors.txt cppcheck -j $COUNT --force --enable=style . 2>cppreport.txttmp9balx013/HISTORY0000644000175000017500000000056113616566001014014 0ustar carstencarstenVersion history 3.1.1 Bug fix: correct device selection by menu entries and load file. Translation fixes 3.1.0 Add USB PonyProgFT interface, redesigned interface dialog, several fixes 3.0.2 Default build to Qt5, smal fixes to build on non-X86 ARCHs 3.0.1 Small fixes, Build scripts, compiler warnings, mispelled words 3.0.0 Project converted to Qt framework tmp9balx013/udev/0000755000175000017500000000000013616566001013671 5ustar carstencarstentmp9balx013/udev/rules.d/0000755000175000017500000000000013616566001015245 5ustar carstencarstentmp9balx013/udev/rules.d/90-ponyprog.rules0000644000175000017500000000123413616566001020424 0ustar carstencarsten# udev rule that sets permissions for PonyProg adapters in Linux. # Put this file in /etc/udev/rules.d and reload udev rules (sudo udevadm control --reload) before to attach the adapter # CH341A in UART mode #SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5523", MODE="0666", GROUP="plugdev" # CH340G in UART mode #SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666", GROUP="plugdev" # CH341A in I2C, SPI mode #SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5512", MODE="0666", GROUP="plugdev" # PonyProgFT SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6e38", MODE="0666", GROUP="plugdev" tmp9balx013/create_src_tar.sh0000755000175000017500000000121213616566001016241 0ustar carstencarsten#!/bin/bash which git >/dev/null if [ $? != 0 ]; then echo "Command git not found. Install git and try again." exit 1 fi set -o errexit BUILD_DATE=`date +%Y%m%d` MYDIR=`pwd` TMPDIR=`mktemp -d` echo "${TMPDIR}" cd "${TMPDIR}" git clone --recursive https://github.com/lancos/ponyprog.git if [ ! -d ponyprog ]; then echo "ponyprog dir not found!" exit 1 fi echo "Creating tar..." tar cfz "${MYDIR}/ponyprog-${BUILD_DATE}.tar.gz" --exclude=.git --exclude=InpOutLib ponyprog echo "Done." echo "Creating zip..." zip -q -l --exclude='*/.git*' -r "${MYDIR}/ponyprog-${BUILD_DATE}.zip" ponyprog echo "Done." cd ${MYDIR} rm -rf "${TMPDIR}" exit 0 tmp9balx013/Hardware/0000755000175000017500000000000013616566001014463 5ustar carstencarstentmp9balx013/Hardware/PonyProgFT/0000755000175000017500000000000013616566001016472 5ustar carstencarstentmp9balx013/Hardware/PonyProgFT/PonyProgFT.pdf0000644000175000017500000136613313616566001021211 0ustar carstencarsten%PDF-2.0 % 112 0 obj<> endobj 113 0 obj<<12A1B8DA64709C639B770DBE93DA3C12>]/Size 5186/Root 114 0 R/Info 110 0 R/Prev 387858/Length 751/Type/XRef/Filter/FlateDecode/DecodeParms<>/Index[112 5074]/W[1 3 1]>>stream xKHq% $ Ct,CxN{Cd wiY˂=D{Iw-P*:ĨRn ?o?·4l2 ?Y++,kS0)؄ߑn`:oXrddF}:6'DW /tQ}]zDW tQ}]v.-.kgCUTt]qEW9Ӣ+tQ}]AtQ}]EשcN.]5'cOF: tQ}]#w]T_WkEuu]Eu߈. tQ}]Ek *]Eu牮MEu ue]k^n]+zXt-;.ktTt-9."ѕFU[P.+]VyOtQ}]Y;D׏,tQ}]O5pTFk׾:vͻ)M6L^δ(LLU[ҙ. ɝ}%wxj򴈮˃JP#RN?wttkEʇDWcC+.Rt5|FU$EuUj׊ڍZEWCtQ}]uă.+`MoSΠeǍ} endstream endobj startxref 0 %%EOF 114 0 obj<> endobj 5185 0 obj<>stream xc```a`e``x `6#H#>D(f` #p*U\Y~g cKdfg[.ζ [-[3Flΰgkdib–˖6V dB0@0dC6P HG,dB;@ l6sL2}cf,4cff)f~f [0,*K endstream endobj 115 0 obj<>/Contents[5184 0 R]/MediaBox[0 0 1190 842]>> endobj 116 0 obj<>stream x[o7 潊 .381"=, $^G!w~iH}#iNIB )ihR5ǐCcŵIFɸJH^V௥BДLid40iHȩ! |ȥFa|SCqs!-ys%YBԪJɼgRP-NC3tQ =-H WshP -7 pDmݍF U.VaF -6Zh VZl`%& G4eɡ Z-K =Ѳ -'ҲH荖EC ?ve+-k }в aT+)#2<"5b>g64p14bHA#|Fʮ)5+5hl Zd * 4 MadxEبaTeglH1ԙz1Y3c'F"w1?9a#B#8'J}ف[x/X|뛻ݑÙGDb~|s~嗧/_-W~<߼{C\.^)C||x}|1s+c:H˯hk[[g/`[;~j-3PjŧATZeN`.cV5Rk>5̾iF96ޞR .SMjpϪVT:ו q'OKV, 9KOUI͜ .Zo.^`Zհڜ|R .&L@G5" JPC:fbx12f4يHYJՏĥ"1.:g@7y"N(s ڞnD4inu6Ynb <ٍh,'K> 4$M51Y"Nok⤲,'K KZŚ%z,'KDPsHd.1)&Kb2fi&zbD,!+]DL%xʃHx/&KɒŒ?%\'dz33yX7%v8LxAgt'55YRGxcjD,` XRTMԉy;fD,Qx95QN0VPyjD(iّ\_'du>|ʡ_Ϳn^?yw\_߾#޽G. KָҾ^d$}ޫQ/>}g 7T<;4k U/O˒J]e}w5^hlTvg1 endstream endobj 209 0 obj<>stream x[,7&^f2fYSNӖN4luUdmef="="J9mS O')O?wxz_?_ Z&3Ŕ*ΟC'e{ZV!pɅϼN6y>P㓟|(| _NVG@'?ڝ aO@U& T?H'3*C>'uS ^er Mo%pJȐF?^mha&& ll)M:K_wttYTI>}w_,iO*cUdI~#?}W!0:~׆,=q廿{E+ bgHyy><~ủnOK3,5L+dzVcUա{uԯj3N&qeOxvO6xZ:iELsU> ^_ eMvumm5f u/ݟGlw~g9/1.j8Hk?uiRl"Tdv;)XL7[_to]mS}wG`bw&//EOOY8auCQӇIb6/ϕxXFo A{KQo$|dĝ{xtjCx~}~ڇ[ti Q>*׀߾XMbawlev$ +ܹtg"$ҝ a&>Fu^06,@@] 9R=&LLqSyjJ'G3p:ɚS @Yp'mid! +dU6عbIK`Sw"۞ڳ ޕ׏zrQiJvۧ~:@ 1WBO:9}lsc\ʱjկ;]y{W`NtU\ sQ+vXBi? oԙ1_庸U9bhck\R'kĨ\Nؗ+vXb<)3*)P9FcP\*g3K#[ ɟ Zj qw*k,GX4!7h]1%2@,1ғk?$'stAgm|@31Uat Y7Z91;Gc,.sQ^qh(ެeΘ@圛c&Jgut\8~Xʙn!z~CGS,.mETL{ђbaW;?{9csnwh(Bb֍;",lj'qZD- C-񒧴:y-H ^GZ'#-)mɐJjD[ ,72~a!n1G ostmr"+a϶&qOں%ֶTNF VdjOz[,72~qߒ"ɻɋF ;׏d& +a϶pOn#vTNF VdjOz[,72~-D2p|kO78Y{R Puۓ7J=D'd3"1]dPEu ]A-R;T C)*Uw34!J,rˈ_}56ș a2hêLnƠbh!+$6B}<`'NL)?%@b&L4v!1ƭLmo,VшhE]LöT$rfdmf?"^?>o۽-B!]cQ.j.d(zbK ME-H[e˸vZj|p*mJ POgΒ׆HQ+x@Ek6C%kGj=([P;;!G5M EN:bZ@ʟR=IIic-n xNjAds"`zQ@9%:271{zjZ=\I ;1z7LKF\ ;Eё0Bxuבj/6 zwe+jfq+pXOzߎM_e|>~^ deB@P߾yglP[||=s).iOFgu~| 'įv66aWD59*ݙSZς&jՑ(YIsdhVYM$wX]yHzé.jhb1|ۖ~j=ק8US yo$.Fpd&z!r\s/ >  I|;i=6½+#@@JN>Æ)erx?pzq[Cib4s+d|^aN>ї /߰3-/Eذeg 7iJ(ܤfdK䈪N8,#Ҧ }$17J\󃅿K4r볎 \.Nb' GI.F_6 B'G5.dlCAḻT`0'cNqu7sɦsX+Oè~vm_VChgVЪ@Khe|2MO2":ȭC(]^пMP)p2J>h[r2RcJX6YkFN6d|9Ċ*pYyb4љJi޽;Dɑj@CT* Ofr'ъNvCrxJ-Av:=P8shӟa;L4^CAnw` j2Vt@TnlgIbE8E!XeJK=VC)=5Nh[J:>8C6`=ZjIp)HhK ؐp.ߜVo)'r:Msiʒi3p<г<ס7a:΍р^􎫾-e`# TwGjm]u-(sm V`r:3aù5G(o- _i ǀ7n5UKZo،.^.UDZomXm9bJ"7 ,fSjYoOp&S(-zxWQqu:^u'{ԩ6_:]x NDa#QiXf\mQۭt2:DVU9)TY>r^ߴٲ>PscYGhҹhow1|EVzb\GI h)[n^f3t*b$ZFGb6>f=@hmB kRt>+m" ~dDC;Px/ѺMH5(L$xHLMd1[ 4Q^;+S?TwkkmNȤ Y5ly$o1}w}xe /BS~LnF=5fhl@@=Jl5 榗'WvI\R̫vI /UqᑙϷa0\#rɳ|e{쒬k%)/5Klo{^mf*G*1ccƢHY1`̍ddq>`kj0~XDnK3$0 @&wDM5 qz 3z;5n>ˑdNOo4 $,3wmX]'gRA]!'p+HD3?˸1WtZS]3շ`$Q l$g⅑^ }XkLKKFWk"rp )IA^dx/Zz>Ғ{t5$/."XId, {}:?oLKKFy40b+:e%z>ƽ g =ih&w]&E0bL4~hS0`pe=BamD^ E: w C;tY9ّVB_zx; .g߁b2ta SQ]]>R6 J6,Ǖh3h'.!$57t!('9MV#] ;creyzҀB58Kܡu5wޜB9C0:rӟ3lQ^#e+<b閧p#Wt6H;pirq0^ƜaKlIr77xw%"gu9u[Mv#Dn!ҽ 1#6#2f 6/ʂK5Mqfoꤊ6!NKu٘=-B(nB#a ;v_adyH%L |w,PzY֍Zý{M Ÿ?v!n3`&,ڟb,ڬT!?s6ÒlgUĈZ͉ w^0""#a%7@I,<.3}ԟOuA1BiͷFvSRඤ?F|)S? $ n$wm|R@~@HX6P¼'7ER^#,C˖UC օLr)ַ")nzaҚ&zZ/l?r׻s9V\#) ྤZۜ{Y^pYI].z* ;kd;0j yGt)GKHU d&30wΉ@,Ιp,yjgF!W̮gWm:$(ccB-JۘF:0NkȼIڈAfČs elà5u2nn!H5J&jaqR֗dlYc籨}ΫY5ZN+JauT'Yk q ^lwQmö[;s|Mp̰r~+{}FD%\)`Ku4Zj*Ct!}څQ֛o[rG޳؝- N/˧x^/sxse8Z%pXK t{ȇrњ!T03D}2u+눴40ÛRzeM}#y +ۮpeP$ϳ 6&́(СGcj`U1aɓd&t<C_r7S-+&I32iyϔO{F=i,DAuEr%w$2 ȗ[Κ%C\Z)!94q Ty C6ni:7.[%Rz^c #-FEU47BWFSz^c #{Ei4bcsOZB/ԗK>N*,;/*c/G5 (=1tbe-VΫud싃e/>(!NVmO'+u|D*nk\4R0$E@Ō 6ٌTArH#eeҔ ޒ\1mJ E&=!v}=1Ny ۻJD,sz~rĬn~5Ayp͗5n =j0Q;7T[*}Jn #/ÆŰ^Iuٌwxc߳0fTyeði3c񎄔\y66Y|L2?Ċ/ An֌meȜ3=Y@"3޸9SA*}\?h He^];[3BgsvDw~- 1 w!]G X?*PW giJ滁 +0I!m (mhrw@x< rvsf68=Ҡ6 y?jХ=50hP DFGid4#\oqv@{X0 r]o@lcsh -41Is0D*sorW(1SAoGfrTAqui7Yy;9 Br1UXRfbq予ܭ 9;AqB5iQ3jB͎_5HVTfhAG̻0絶i5|IiC̯i/hAn֌ G|C7lQW%xVQ^u))ҀeByz=s Bt{x6wEK %nmpupgT)G]^F#.oKKޠ.>_YiQ \͐=(mhrwD]xu:nmpuAKW:%ohDtC~%N4ae3QpUN;И&+oUEU\InԌgW{ih=D v6uҖZ{,2@U뱏kAʵhC ~l9.}~,xݟSҢkCt8&7HՂAyK ԥv$"37cduFVd*ۀNS˗u1|_ao{s y? VYSjn3+:x v e +SDj絶cx){ӎ__iqw`[ ׷5#t9g6-[4] Z_GVڲ,W[r=NV`o:Z#"+4:nmpmQ'(đ5h+pMA[ٮ-Ғ^Pߢ-A6+wE a7wkFlshKM[]^"4HCyk {>?S <.lz?_Y!sC%m6K/^AKݚ:d򂷞yDӵ.t1/E^nfJڬP1^]z;[3BgsvD]PS]% aM89J 7KWhT $+0#.= -V(-]AnHlss 6]٭*G[T*/ډg{=ޣ(vtfwKřFs[ G 2A6`2T EР@+  `t2tMtw64[LɆ]_[&lHn6Ru)m@m8:eE> (bgC wtXۣJ%[ 1Q%5Dl{`^( lS a> 6|7W=dЁM BKslsHm֠ӠY"A wRM{B:c&zTIx@Au:0p:tJ(Ym_Ye 6C@*ĖXR:ml&49)l8IAA:D(j[ c4ѣJj# N^O 4PF`V|[+ĥ@*}S с,ŚY tva03CB`l*)tnQ*3hGԼB; ܫ ܪ6诬(|nk_X!h&mg;D6)w6JIזL) A@t8 !B!$Hq'$(3hGԼBE2Ͳ/b*iGi?.AkZ>W dK!> &$+1HϤf[BX%uxdP`td-wh@!R!J1bIB0c&zTIx@!&-{b coԆ0Yc-^Hh ݡӴ݁G)3C2H`l/0+&E 1F=}ܯ =<5hX7ސu\O.gEox:;kul0Qӭޥ"Kp~ֵw-Ox %墂֖KNӎ.Qb+%+tQX;oZ7Dut7U?Psď|c1_Yom>HimBf3tX<%$3WjUDSv] M1}JLx!z3CaB8zqx8,:jn= ^Zx\ $>gp.y,)LJi$RCjCzĝR (lB 1F=}m \\>M\ : Ғ8F8t"fNJ aDР@s$LtH ,I-1Q%5cxB<,R^$M^4nmX_l$[Ol(Ǵ\9Y\uT4*zq-|ДNN2xz:wJ)*Ej7annpTxje5-?Gf8%I`OOv3Si>G~Tq/;yάQ6np4ِ1p߳ǐ8ZlAC?@zQ]4厵NCz39~Z#gwP0&h(Bb֍R51pGV1z4#Ш㟽Yʜ197;L4v!1FHk*54"gvfR&BqaC҄pTt93՗ w1lph\%}(0ɠ;t/K)G)a7gLJ^4{Х[=њu̴5K=w -#&̳ BX7O`~T~I<G8W yZS /|w̑Qk'殮;2 \vk1IfQĬ/7E 2E:'2AK *L溄X.{g#qŰ{9,*Wkb0CD 0cx$d:sUY`2MX-!PPGj,3Y& [vB0܄D$m;wEAbOnˌBXM]fNws,{AT],:U)PkiBѩ;0F5QɶEYf|JN`3>®Ěy1%!N#׸8ķ!.f|m%mcNǡ|::s <!uY͘ *1כ6wH24C¶ZuӺ%dÛmBDMAq8U&SoT4b:7xeHJ `#,-HP¼'wx4 ) 6ԵU]{T A߆m<4wT7FYa54F1ZIr O XOg跙;7s?#ҵ0F^kd庙]al7${)jez愡`k|)Oٝ[a@3%$%= YQp5._%D%H=cQ$EO1 xQ(A& 0!zskd#jt<.4ǓGd]5T$%RiYX"Ή lcp5C[|2DRzǡ=5TjUƄģ\LIK#W. * M+V&FhoFj6">˹&=pn8a7۟\\2$lCl޹Gp'sڽu:R.~`ֶ={8 Ǟ8KS+j*/w:)JS7S%y}Ha2=[U*r!۽-уx@o olxfxsVT%l4Z(V0O.f3fCC'AI%-jw` B2 cVV:M>!Gj?dR+{ lHU NVg|A&MV#Ҕ${$^Ll$ V_Ը3c! t&UbKof@䡛fdGfkW3֨]ӹZzpro}V^୼[yo x+/V^j}O7^'/&Q㍦ &v`{qJmyG_BJ_S~:!$AMx s 69l Lk,9qKp70⠪0 |#ԭ܊i;Y1)S~[7 y, ht`A@ߵYz T+*䱎\aԲ^j}] &U-4@, D#z2 ^\$:?ш-Dz952p]rreU ؔ慲/&'(%;fBY3bn.t"AG1I'9eB6[[J_VŢ_[pij7pO&_m)|WJxj۷|2Mw$"u}LKG{YL0_:)'v&epmd$ :TfKck[C#uYT 2x λ FGkzI18 6QA#od7pQ&c %ƣx({O 9Ƭ񻾭55DNxv,h{V 4:?G޳u¸5?Gop xnHmDÀ eP>f28^L0E`w9kbpzKDfI?<~!2}omAGȷR0Wbe`=91.S. Rȇ+OP;d!` X8/Ш.DAZ{; 6)[YE X-|u4џJj{8*,&L*g{[vAiH=!f6憩Fj\9BW!Tw4I;x{.06!]"Z(M $˱Nȡa FYAӑ t@4`Cv'|W"zrB$d)s5ܩJzv4Sw8* 85vg ! hI 8 :Hq;7c=NsIG1Rb%~ R4C y,Rc4fIxeta #ssa'Hi$"w3gk( G9NN;L 51iG?*ؙ bʂ'CVËNJ@ڰ `}AΐhO`јy&5c }⛅0W~cIVl\+-}JWXˮ|nNNd=71:evuu4#r6gG6"/\bb)1 fP.^bt9sے |,g$flK5&a<#O7 Ρ-"K{|1 ٹu;^%!lrׯ#[N޴ho=x]÷ /"4ϐfS\I60)1BM@^_#2"xSw{4bÅǨŵQ|z,*xԟݹE8\Ȧ+ >4ٺB4Qo+@ y,MJp6hsF$E'eDg*y9[l$Og7m·LЖC LܩRʢC059V$կ xdpmscX<1͔ݻlaԭ|:nqw9xDm7ԭUզjڜ-yK}b29 tTJKi :T]Ʊe9~woma ؍҇//E:ߏ օ(6N~ֲ%m3~rZzPRas ɣXq> _SZ]y>PC)Ծ@hpqoUh8NbHm1@i!X!Cfјy&5\/3X~)(,ژ@R-y&`s18zAUFktsO.YFy3|i\<ڴ.܆>ћ&8:[vֱtQui:V6f4ӕ<h2Gf0F=)0h9؁[ h5 Y,ܚT ]taq(ȹ׶\xl33yRbgBکq|<%7zժkΧ[跽Ui@xPRd0%$u1 ^vi[&*-]캾efKG)_5/(x}Ia>!7rA߳;s`>E ~\]91`sl%AީT@k*`K[[ *t 2֍ZˉgG0hTJ۸{ҹ:*ͪ|n[x8އt|`el\½'Ν{whoDx$L-wS$ajy$xA6j}]H&ۯ5zU/HE(G6tXBIM0o6ct+M2H߷W: *j.\]#Q[l9Wn8'䘬_un&!+]S>?[OpjMjQ׊CmΣOX&';hl ! n>;%w #[rA #+$b,)u߶8[D]Ќ}fъQc@`nܺ"]yDli_҆6+w7pr<'K~'}JIl@IvZ'h-˜xD΀Yse-վ`v+a+M3eh^Ue 3H 2sdWAW:LLG i{8+HGMEJ]Wiطc|Ngb.ķ<>S.?`^>^_֧(smDv %o39_>U#qN^$i=" ."DnS4S(Iݓ\9W4$ԱQ#x)gHxصw6MLV8bOn(\0!i)$CiISNϒ$UQAًUc1Lj޻쭁`C!v;@-@\Fn ,_d EY2. ]ud{ Y!) |rF9ymMYYXԗm b}Yg71EVӱF&טǥ#@4+Wq^& nD; <&Z>]r0EKEo,SZp`N<s~oneh2Ud,te^{ՑD=4 jDч!U?M3o_26'D:NE6MIJXՁkYDcɫ}k}t`S&ij"[yKL:f5[B8">O|T*kh>c"{GTұl%>#9bqA7CK;z*2,-˚أSH-"(I-?9_ v w ][[Q ,ry& iOa nM@dÄZDt=p$aN,snoHo1h &B^k35xӨC'0*T]Tٟ{ "$Ԁd|綔=Sа$vvBdm?LmҲ= )~{_2TMx8լ!|ut;:('5;9N35a: B .F+-.;2U@/);2,|Dă^ x,ǺkD].Y},k#K},7nD/@–~ȫoIn aYو?<) 3 څxE^3w׳q doyՔshCݦi9ö]j[Mp߽x>=KHmaUqϾ5R27O6 ڀ.).cdfj&x/` oֻٚޑ |dY+J)qh[\Wˍ>&&.gBڄH!8Cfʸig`;(:ZEFs47y%2( moUGTIO TVN> ]9g s&]rbjc yr6 0ڻu|9AmMW0'0=a}Ǚ7>dVY۹/C]?l.,?l0fRPˍ|pޗea>^ɠ0(=IkCP i@:&ȏHԐ9L=#LMZ?:3 Et$tDLNN\5  BR6fFiDP[C+dw/97 ym5K]WV,4Ugw%AEΜ]**2:W[ܓ\vXES o6)x;'WL?p!Ⱦ7rT =N*-sR6wFٻ'g7 ׏dkO!_eEHU-F<աw]v I_.6m4}6tZQ- m[y~"nDWԌ"  PjѾik rfrӫm_1څ"UZԝ20L_-7WM"iv*'T\0K J5|&iEYŒIiu9Eh@iI{ԩK4Rť<%jDĩ!KUY_qYEYtf$rޔk*JwĔVJkP9:o'ђG2U/A-3`DQ(#vxB9:;{c# cьD>m/(}b9 :lw-W S5y;*# B9+G٫af$h~A9^Fȵմ:M:r+o9苍u.NтG6\EX<`&z4hV{r:{HԐm3=fk{[WLJy؊ie@O 7B< R$5*b@m1%oOWlJ64M"ADGv\#zS5;j@K3p?bK+.Xjr1Br*ypCۺNzg,q(F>靅F.*yݜ]&uewH]a7%Q+P}YV7uE݁a۲эS(F$ R 㺁^{+<է2xmARPbt Ln c]fv߮,4YW>Fﲲ]c;E3b ,!rehK)5@mOCSU\sΤk053lN }&bzXq 5/Af2mzcb:O|3ytMF r&or[Nsj{fMW/Qg's(d8]0X>_љ(j!B~FȷoW^n儀w'2w eX 2ZɦQ=|%uu bipd; ɐt9d"DL7cpyOk^.76a[Xx$\54!+-uo0ӨĽƛ$ZQ1v c^(٧y+l} >^9A*+߼BݍDak#P;/. /8ZAuYjK(N֤9EVD 9|&}7p!c6rB%Ƀ 1Y늠7@gFF t2%;\mgTYrpG޲E2-Uȸ{lJXƒܻNd.A9afokӿzNp鸸rqD%igB 8 di i)Qj&E$Ag9&3#GuxKXB( ; tCv`" =1ȱTYh0, E @0AuP3x"sjk¦UcI#J&cLL@vxw||vo5|d*~R7 >͸E%ifTvU*Љ/Q:S@R\}lMxbn2%^n}uҪ3_g߼.xUE@#.!p`T/K1X믾|]f, ŠvMBWmU_QW1 hF&V6as?Z[=LU)g SMgm hGLՏYjvkwi)2O;)m՝no3 AH΍F/݊azCVp< V dr?6<]`H5JR|0Rwኳ 1Li;c.p1ʎ٠Vk׎L#Wϭy*u.v&W ֧Oucɿp)ZFN!GN߹ k/b<13Ϥ}D. <ӳ0=PԚQVkn hDNqf Dv6C"J$1Iˉla";3Ϥ}52g4n_˜ [FPnš^j@|n ؐqB-cmyۭsRS8u`uYDҾms}9Kq6i[ .X"ܾlQXδ xԼRN)-wSt,GRiːhұa-Z=qdSDN˴6>- :CH4*$G*4BJ(0 j"0 dTIH3v@<9amʀKglr $0srǽ٪Cp1 =tMlz7Eq'J(@g$ZN!E@>3)>sGu|'5=Dsvr9fۊ/Ai@w6ցͶꤚ[fZgјy&5c7ɕj >Yx֘טj(ntөf>G̮Nna\z{Tƿֽ4"6TY&!Kaz!ɵY){ah]FNw="=p\/n$dO5 &wMG6#7yja;ӷEǻMf۷b7~QsL_$aa򠢪Ky\VN]VwdOlfJygݤ&o>E ؐ. Ւlc*&l2r<鐟T`G.zB¨|#Lj3.A{Vr[摱Z\=xHCׁm+dJmMҼ||ʎA;A ."7Ļq}z3҈TJKbҬag4Q fikƙ VZ[6OdDW۾Ff=]w.jI,;=޲W1r ¬Ow_rb:P٩&8)D@TV S(u1f'sҧ0eHQ AaHSC/(Y\1sΤ,'Lc9ymԁ 6:N".j)eqp@hπOCX!gR>SXU\gKh'P+OYd>na Q(o$y*&icRJ<0.ދ|;iu!\ٖ l, ų?n0*vs󖐖=_ژhTc@⑔ƑH #b5ɫH+RN(3;:BZ*얛ɴll;+<ȥdXMI}Wa(Wlɴ%l~3_(x=\J[sjL&=5o%/=ox4#֍mgg%@ðxT+Vf"^d#;v{F6ޞ!k(‰r#]q]Amblüt)phr$4mX<rLH.rHg!g௵.[Bw D#о])X}Rzt8p9RCoWyh#[ #6y{@Rݳb6bUdIr+'QI.Pϑ連Cl6쓭w Ш;.3&q8MХ2H+BYX yD<^nal{3K L_ c+->v_%<#Y&u&3@K>0כd0D bo,S0ZS9\Y42:"; Rw9 6oU^X~Ȁ[$P}rsHȾ5g(Z1ԥs vaf3׆J"1u #\?؁6\ Uj5ty7>x@ֺRnr;n? ?~2dG{)|5]6ّPm`!̎v'빍#@u`HLU#B瑱%Qh124lCj[S0fWBȔ?*veјm&56܄BJMUhYRc|>:C[L' C`Nyu.>;g-\뼳̦QƋsWmଯK;̀X7ط9ɞCmA=.3 0.LZpMN;J̡g6m2Q2 _x#~4pQIIxT ,+#ĥW6d/vSZo^vX.l1P@Ԉ`M=78fi[2kPw~X7޶%vsDȒ_]```CtD~xRG+{Arvlva-jW2-Wpiqe{¦J@ziQ!spٙtBCCG*VD#Er#i\̯8Vj8Y7.ҲklvCxՏyܕ-4G҆\y#BEOXMZ:).~a!ly,~拱zEEBᶑ`2%Ӝc jSFDl Z';8![70lifAyu>6n<-K6(5"riݱPdPOkrKݍS(=)(ܴ7N-5Ja@V{=gq V ؑQ f bc-:ʦւ )fda'cBVpytI$2tt}hsOib+`ST 6L&#v Zc}Y+dਈ,?<7my$ȢR3Zi= k0ހuԵj6Y-.Og[vk8(4z>u2b&9_ƾl[:<1E8OǞ:cFи,/}z%l #*MCR^oh :+FcΙԼ7MDg:,EnRG*KK9w޹=Nr^ҁS#xl{cE\9vTs.Ik*q>AU'؍ N.}\;\Rb7McxyEQu%*Lj}RMO4Xb:0C&="7%ʝzPa Z9ծ v뮢ΞDf:I0[FVG3 ;gi~ `BCׄw̱|Grp뽁)s(Ek]x͚$w`/9V瑛 3\GdNuőA.( Hՠ=\\նU7~97 Ckeh2Su͂L3q42nԽJGG3gCHՁkh6W5~px}k#y%iG|:g}X6f4sUp&c,]YZжHL#n^Ֆ`lrָl|؟~VL}B2DEbZps=YDvxa •U]+)| !wӲǫ+x3ȒN%|Y1?0p^7g+\'?}SZ<*MJG4̈#^C%Л!R7\JZDpOE4'цD%}sjWbVvmT'*YKz`Jobq_"!l͔P?Ͻ%-kFj_Mil +ة:L=oQ\> ҦY{d4>A:B1'TL'Wik%:)Tx*P::A&0 J^SM%DޥeгޙD0^ wi,}-ǡJDATw,\Yin=4^4fQ1&SrČr%[wq*w[תE^G63yZW7 xڀ dZU'Ϡ6 oE4 ʸUAu`CFD`*nA{#ٞPE-m}#6N2S0UJYjul\~g4UUJFt谆J/վë;ʚh+xlx(` >{XOJf' 7J(9^d_&E:P+,)n@ʁld'SeRUrkq* 4؋~XxaF"k) -S.q~ RxlB 1FcԼvQ<z. oӳNCfb鉩eke7+l9%SVk2L".p*L@jPiq% $vXC%m2}cIlM' +ʂC_}f­Erz5O!md 05n c>ʷGdx Yz4=؛ą-E.IQ}t )Tݩ 8=XQ' 7ؓQ7b0+ɍo$7|7/ -|4Z@5ޅ]cڂ/o|$`/7ďkXV߉WX7PSR&&~JAro3Ytr8?ݕNsױEc/_ v~G5b=9{ ڔ#0!ܣ c97E_I}%!?5ZDCgp18knq X?hHR&?VGF1tsyx/ǂx7lDBwB=Mp6rey䢍r`loZ޹vVݬJv V싐A-WdAVImw1iǎHs]8G$<_lyfcwi^.Fn8"f6 .&=?y$]4%p7_~90q d (C{"+<#$,yJأlj .!=?y$]˻h$Dy_ yf A )@dC"+<gm8炱BjI@IWg`x3!{L܊as|8BP5vMSw/dzCf[D o hMc.Fl! X<%Ɔ1`ͥ%6XzUri{FI[ X{D,2Y6|߿kHU`MNR 2.;%Q( r2ф۲@J" ^f6Gqj< #rȨmZz9#Hc)$v4 Ĕ)Cʞ~3Ǝ%A#$W۲"(ظ ={FTKz)/tIg8[FGaB!B8R ^ )^Mowxд !c'r!y<9sEr)aEal ݚS5;HΥdbrq04%YeS2ܖ5,f#=?o-vm%M بxy.͑e[a{B'&,`ZJA5G|~+KAՁb<]0O5X眖~F62Zu]0 [Pr9ya!fZ<cKDar7ԁ&\ZG;mYoBl]A*DJ:ȒrT Y6"E ɰ 4K}-v~E%SFG|f/Z7 n#[ LȄ\=}ѝֿohEDtae]AXYRڢ]2^Xuj)2v$H3NL0I+J:lM&-o H3%е,JHO$Oc'nv8pRM]ozH8eV &d@i,&[‚6Kښ(LxՔ*j٬TH"LcK<1J@3+ׇK]BueT!݌뿱c=f,At?Dk]%mZ|[Jd0T٩l08>He X %bJG#۰ﱋCFAV76tKt{l@􇋃|6&Ur˦f9#jrU. 1R_^* -۩>q*oޣHF.dAaQRۖW'Lv=Y?7p^I| F2lV}m݊d-%FZ^,HWxd_߰6l*-=ɀ6gYC<>6)`W]q/>q^u~VZ:VTi 2>NpZ7UGyj:AB+ V> ;lei|)m#OM.j#iyv%}w<z2οG?VL=a5+µkf(݃||Q OWY6]s -x{,r-5VHL!&zش28i2qbN ζ[Q I<.[qk .pAk728v-8~6%̀Z A@A>; ߘD؅$p\. ( .+X BŒ~Azrb 2ԇhA!pjkmkY|2~2GQ!HVf7fW ASq") k}zqI#.R\2,}n2N8/X @PKOukhKً9D}]bm׊!n|"|q! #>q=ۀ3ۂm^60dn{M0:McQ[U އ^SumW~>)9!8d,r[ZpʯkLt6篂wp̨2a5# ?7Hç* WId-+AzaESܑkZSM0!ZǶ,ty# ȠyFřHb6Fzݎ~LgVoN$\65ʳl7)VdukR ]z͆AE!Ħ 2x/z-ӫ/7.j$I˜iaGrȋUJ e2\| .7@&p@BIAT}AAF 7"}d8aNK ޶֑&fɬ2Z:t!x2@ $*=Ƞu95 HG!lk2YZ˰28gvM 9oˁځWJy\Dpsm/Z0Ly6g/ޓ~NFd}`'QqڜlsFjzg䡭}kVqZ`CQq!cAq\hvA񎌊3U(7/x<Kw{=)A xf<#k.!+W#0F-Ο5oNӞwCYnV35e{u2ੌ#\A V%gF5Z%W3S⚳SMvk^/a^^FNU%#D :HRP8H$!IX [:4ΰB|϶ŎXɐj~$lo$f=5ݯ ܯʚUVdNWL8qj{U,!хZ÷5{Ϛ/ r8`bO (~Ht{VZoy]- =1 ^؎+#slHgXQ2ǴcHf>kcs767CSxuU%ćƗ+qe%Hoq0ԡ9EcKA"6ؑ+Μcm/) =&VUzU|6JV\9 b^cˆT3]R HΌee;x#xAdGLPM9τ}7z3dQpbc`!A22X|%cSĸFO=#%wHcAsO\K01se!֗+qe%8{4?B}GF{/dZx7D DJi~ lR%WNbM+]&{U-|B&;_HY|H'KKOՙHޅ K~FK3]*i=k⎡#'RSka g@)xtq2׾cŨHNоP=[ܥ}~h8#C-"$q `]u+KmQL.rDF" (62 JA"e)! V2 5{dr)s"_2E`$ágrm?zT аEf;-z9W~څ{j},݄}^7}MJaW=ḿ轾;pe'U2JZ5K99V8]wvT|K?XpK,i[9}r/_M=h( zI6xK^.WJ-\|zBĂJ1싡DPVr#قg5!p6ZYMDTmf &#꺆O{8Eg/f G{cy@ Tqr=BӖIv* 0їM'^HGcx`‘0FĶM4#Wu'rF0bFтmYw/_g^wD00VX7*Y!|x5R"yu+J<^^(Cpu:Bsqvf@9xZ/;w'f;^9nNѾ(Ƈ2@Omy0pԖ!8?䨟Rb7Cyk K9]{#%^Htx낗TmfgkVxNta nnJ'&c HZFG&#/MlbB6%Kt mNۇJm vx4£.r9#/˂~&UxBX2 x3md<}<-nE.!5E#oW+vf⸩-nۯ<|ȲyGS\ʍ3Eg+5|ٛ#0nE2 XW D)9 @NDT"Eˢ *o5jČQF!&hp=vN+xb7q=swTץq4)h{Y'jE03 #RA3"yiS mЇi}`Ag\ 6%!uPeϐˌ|Aj RD=دyj6WVk۹4_^4ѫIXD)a%63`fX*iE-f2^Xu3TSC=Յ6U<-_YPCQMҰ v u-(΍V9 \#[ڲs@R2Z9u{9 ظ j#(e #Ns${ֆ5f3#zj--[r]~] :2BƟ߽56 "87udX (YջIîsk\և{Tx@B% `zނw6gz^2M30:_9Bfs ^VN 쨧~ JV 4בa+H. 3m󨿹eTخW;LC588JBz> Ǝd6q0x喋hE4+o퍂ehDm|BiD#/"8T;-G6v/݄Afǣ׍{?*#RӺqyZp?BE^$\h.0jPIY!$2eN!"bN+e(\hÈ9K"*@P"~pPF o2\B' |$yFOn]'t1Ŭ z[&NOvraǩӡǀ~{ loJzPX1@P,N:-N>&O?,r 0VOt̂ 2d "$,hge}y+7#H3Oku`g@}8CFD[x;9K~&{"E0D:IaڒBGǨбi*9o1\Bz4lK 3,V >U]P̤C7NihUi1\ X4̅'x"e=s8³"Y7t%+ϡeUp([7Q7")qJR ͡*GT4 feHoA\tX) [M{w,Ph߱4*y/zi|P#dN8)I  C9yj',Y7,R[CWmtVdI=ibG]0&SF{fh1HsQPw;CCB>:]=w2 X'KXHOx(e<'"QOX)[?0bʟ-2`B3fiȺ"? []X\ֳFX χq~2 Ц=!#'ɠJ=Lcge)9D$GHӴ̞#c{z\B(;i2HM|=F үS}ddѰԔ`DOSP' vN295%?0;d՜9 !="ZQ4O~GQB/ኴ~Es)nK0%FAu7JA8oh;zlĀ5lx6hkfҨPLwNnY7F:ʤ9 is5R4툎.dܣ©9Bvri/*v%vF91`:_00Ý͙WL%gVٍL!FM12;INRv"*,#=rwf ; ;T Anf<5ߎƜ{*c>lv`̕[޴s1\D#a.cWKg:_@11ҫb[m Vnmqw).USnz^M9:j^Do>6CKCoUͽ^ +F͈b|!CW#">jۮvF,ṻYݬ`R%4G*ᩈ #pp2i 1{Ź00\x29y#2J05 +r#@۴ؑa>(/:cm?4l;}U~BZ81`:_00Ý͙WL%gV)dypJA=ZQ*_Go)pQ\.lpTB*1Ԥl2)-MM?\mKJ1yYIFD7qxYfq j:8= hi豲x}|~ȘjPj gpd{b;COkz.S3 gw!ڕd’–#q"iOn$K#qcp`9c$`Tՠn #mQE+#nrs{Nkvs2'uH CԹnMP4&2K`~std)p."C;5P)-ɍa~5Ox[Iԩ~R2;o+9h/}^-D`W[޲%dSNV=%=ONXom<2LiE]9#qkiT~$SeDK'}MbrT/l2-턓"V.8 Z0unR Hm;#/Z1N8yy8}Fby|hz.3JXdWOOo$Ќ)(<{٧OۘR|j6Ĩg卢RέЯ̨ ۈsJDjDL.#OM*ΐw"C80wŎ<5Q`Lf5j6:>4a/ჾsپC4OA\3 x~D) 5XGW =.>ax:\y+хt!=4a*3Pk 3 xؗ"^wk)h1~ueh}#w N |t(RWo_~[ye4|,4Ks­z>dAD Rls;y02/~; '@-!j 1V+O|ށ_oqAX4G?ˇsrdSh6`#@2+6uxE{گ zזIF )" \~/iL"8Ǎ\8-AC ?hzVL5Zƒ94zGr\w6.q/%&s0@|j)Wa MV]byO"|5YO{ -6<SfhKUqU0QbkdKI`^NҾzfz]{ mޞ8^rL~n_C+O𩅈_/Wןy*#yoE8V6wxilQQ!z5䗧HBF$̱1r5gc2m$v ܎q(DTI۪rfe6,~)QYج:v lo4-bW҄\iV'ϴ٦1Bndiӑjў*`LJPv8\q#{Di(]2QsD)+-J0D\NS-"Q٬:662h <7#sc3Bؗ_F:|4ѢR/? r!Tr|@~*8` ? goқk pFp@yjr6%WVk5]es1JO[}8շͰٯXٯLZ׸ M11xv.J\GzyTIq ٕpB @v0d]reR<d $n=Rx;΄|*TmnB 5TyqnB '| 5ViAiPSi #z"#ې%=?{MbF/_ ExS  QFMoj@Pex1muJb"Fc뼱E$pb4܆j%N} 5"z3x\ )4ՁM&2J46kd['D*}%NCK9Ӂv]"<0 tCx^'1_+w.KDbqkeYr<8/3ӯ75HOkr=n勽H>=a"bM-=rxe_J|V< w4LTrDǍk^`=H=Tԅ(vW }$٘[]|Ȏ C\iGlCU{e>4M`DIOĊA"O>n5̯LHnb(:R]}\|5 ډ|^;zjۇhg>h:OZx)-~ fGDh?Djr,!3*G}]Wpq &sn4cx*CylJU4Qyi"eyjfHx8Os\ `<9ޙPťj' IfPG<-vL#< v;euTZ<_C]#arȆ" sD~>stream JFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((() dqր(((((((((((((((((((((((((((#Q2(,ԓYiyo6DqvҼ&(3 VsǹvBU=ݏGĖ3$L@`;qlJ_~U{@/֍w,-4O36e-cUFۨ sk.B+j׬Lcx~u?3UTApҷ-/_X5ozZ&5EWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE`^'nL\];h InQ@ޮo'CU(zFqj.٤ tXlNEyo'Ck8y=>K +kB\w/=ܯ,rYW$//BE#Z]fѯ[4QEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESdt6FTE:i26ˍ3fg]ﵙݮ%d#8}mFݎ7ymG=fwx-3X̤y'pgMuO+ӧN4բCw;'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEAuymfwp ?=u]T˨۰c7uQ\\2LQ芵Jod+M\DeŶ$I(CgBismgmxns?h@=.<57Di |ckV dx"9SvӸQE@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQLXD5fs>|ڕ7i\5#\+6-̍!ThT}tvW\Caa gbs͏-Y"XZ9WX}j7 7丬닉uJ'.Ź=z֋s>c'*Ț͓nUԑ݇xǫ1RxIG*^8Ĩ? ͓/鞻KOdmU-59IYЪfd~lk:oDѽaQO@VMtnR˹MkTvFG9gZ*p[!\(Q@Q@Q@Q@Q@Q@Q@Q@Q@oЍhwoЍhZ?b+_?'s?V5Ʒ:Z(@( ׃׼j_Ox=w`șY#k]SVtTb;fv_V.9mS>c(cf* kIA!wԮ?ܐg<'sNŏj:+E@QEP((((((((((((((((Fk;Fh 1Y+c[-Q^AQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFgxB1!h?@1Ykw#r-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@oЍhwoЍhZ?b+_?'s?V5Ʒ:Z(@( ׃׼j_Ox=w`șY#k]SVtTb;g j:(tUPDĀpo@E*pH\@%6fU>§`; +Ujm8}h?PhPiZ`=X ɏƛ'W(Dzb->GQj*+_B#WX, W}⪾P9W*XQJ̏POj΅V+4'#cU!Q4HO,C#⅄.dzch^U9Ȁ`{ M2_뒨Vp3OSt:+_záC܀?'}4.{z!ƏWwOrǸQ^QmcR}E$Gcv֚ ue7''P:*+knSt+>fєQE (+_Ox={ƥ ׃v |U7B6?gMuO+30z]q'/J΢(bשAu5InC]fѯGu/֡?ZE[Q5̠Q oۮjg?5$Z|]0TzM_R I^:ӱ唫\LT\RQKdEU((((((((((((((((((1@>Ei>#]Es]:7h4láSZ:.3C5Eg:qć{wnpC jzxI]O^UX(WԿu\zKA_ :om1UC@Pڽ` AIr0Fpu&kZfgBHy=sZՕLfIĢ3E"4nVEea0~c_T1#'sU&|ǝrmAQABiZ{lҩcWT^ ȺMNs (;A'T꘹O`xFxJr9$p#?W+TɧeFӷҴp1+ >T^+ !]%^drmq9U9X3 k0pQUw #~U?Fo/ɼSN9k(XÕk'Gyl;{v5ROG ef2=q^E5.Ty, ԍDe^??Z'Fec' <bgQ^';a\=ܫc*6{fXy2sb5vTeu!ųʡyu?S}EfpW^dl܁ؓP7bp%5J7,^>֖MY:A :Pb4,uBN/f-G^5tUK6[yf @ 9(#xI]OY> ?BǯFh (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEۥ7lc,S~k>߱SMI (]"8QuR(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( endstream endobj 214 0 obj<>stream JFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((() dqր(((((((((((((((((((((((((((#Q2(,ԓYiyo6DqvҼ&(3 VsǹvBU=ݏGĖ3$L@`;qlJ_~U{@/֍w,-4O36e-cUFۨ sk.B+j׬Lcx~u?3UTApҷ-/_X5ozZ&5EWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE`^'nL\];h InQ@ޮo'CU(zFqj.٤ tXlNEyo'Ck8y=>K +kB\w/=ܯ,rYW$//BE#Z]fѯ[4QEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESdt6FTE:i26ˍ3fg]ﵙݮ%d#8}mFݎ7ymG=fwx-3X̤y'pgMuO+ӧN4բCw;'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFl7uFlEPEP[s[QEyEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEAuymfwp ?=u]T˨۰c7uQ\\2LQ芵Jod+M\DeŶ$I(CgBismgmxns?h@=.<57Di |ckV dx"9SvӸQE@Q@Q@/]'FRurkD*Λ!_UjFA_bθ%gQE?@1Ykcx?@1YkQEQEozZ >'LEWXQEQEQEQEQEQEQEQEQEQLXD5fs>|ڕ7i\5#\+6-̍!ThT}tvW\Caa gbs͏-Y"XZ9WX}j7 7丬닉uJ'.Ź=z֋s>c'*Ț͓nUԑ݇xǫ1RxIG*^8Ĩ? ͓/鞻KOdmU-59IYЪfd~lk:oDѽaQO@VMtnR˹MkTvFG9gZ*p[!\(Q@Q@Q@Q@Q@Q@Q@Q@Q@oЍhwoЍhZ?b+_?'s?V5Ʒ:Z(@( ׃׼j_Ox=w`șY#k]SVtTb;fv_V.9mS>c(cf* kIA!wԮ?ܐg<'sNŏj:+E@QEP((((((((((((((((Fk;Fh 1Y+c[-Q^AQE_Rurk5/]'F_kLV:om1]q'/J?/^rPuQ@_uFgxB1!h?@1Ykw#r-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@oЍhwoЍhZ?b+_?'s?V5Ʒ:Z(@( ׃׼j_Ox=w`șY#k]SVtTb;g j:(tUPDĀpo@E*pH\@%6fU>§`; +Ujm8}h?PhPiZ`=X ɏƛ'W(Dzb->GQj*+_B#WX, W}⪾P9W*XQJ̏POj΅V+4'#cU!Q4HO,C#⅄.dzch^U9Ȁ`{ M2_뒨Vp3OSt:+_záC܀?'}4.{z!ƏWwOrǸQ^QmcR}E$Gcv֚ ue7''P:*+knSt+>fєQE (+_Ox={ƥ ׃v |U7B6?gMuO+30z]q'/J΢(bשAu5InC]fѯGu/֡?ZE[Q5̠Q oۮjg?5$Z|]0TzM_R I^:ӱ唫\LT\RQKdEU((((((((((((((((((1@>Ei>#]Es]:7h4láSZ:.3C5Eg:qć{wnpC jzxI]O^UX(WԿu\zKA_ :om1UC@Pڽ` AIr0Fpu&kZfgBHy=sZՕLfIĢ3E"4nVEea0~c_T1#'sU&|ǝrmAQABiZ{lҩcWT^ ȺMNs (;A'T꘹O`xFxJr9$p#?W+TɧeFӷҴp1+ >T^+ !]%^drmq9U9X3 k0pQUw #~U?Fo/ɼSN9k(XÕk'Gyl;{v5ROG ef2=q^E5.Ty, ԍDe^??Z'Fec' <bgQ^';a\=ܫc*6{fXy2sb5vTeu!ųʡyu?S}EfpW^dl܁ؓP7bp%5J7,^>֖MY:A :Pb4,uBN/f-G^5tUK6[yf @ 9(#xI]OY> ?BǯFh (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEۥ7lc,S~k>߱SMI (]"8QuR(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( endstream endobj 220 0 obj<>stream x[d~HJ"Ơk `<~C0C1St V}ޥRժUOrW2 Q x8K.1_{劙ϊR43pe=+DؓxyZA'b A)1Uf5\>b3(~&aUN ˊeX}ߊ\X.=*6xOm+~wi"!2xb{uw 'X.y2]"*%!Kӽ'evB.l#c̉,}r!Zq{IKNLȎ:,gw.,FϞ8)XKM22c 3 D6:2 ^ Lc5xh+ 8 !JF]1@c ;-8,ێĆ'c;X.x'D-92#.^Imڑ$@tJ'xl|F̹}"kv[b}DU@vX}R.K,(۟|o?|x󛷿xw×?UjSF_XW|Ͼg PWwcaO[1ji޴/j,M4s_\pmPrѷ y[QkY.86䂵gk'[TJG sCYkFіRv+T8z|k)Qx\)1WSl[sͲz#-eHjFl~TחUñ$8Ɔʒ< DJ>4{/M[ {ui2/|k5F aiљ%gGV }K$q^e.oyw5 &hZ%H1Muo-ꀒR>Wv+- `)XU |ksX"jm}I :7\0ֽ\[In.)6ÜPlPw}/])R |kct41Ԍhmu9 5Ժ凈N.BIdk7>|DAy6zau!ȍ Jzy%PeҲVX#k^o8d6o /f5 gRcZA;iɊNA4’Nw:!Xؘ0aT9gR\C2B*wKSy#[ۜiڷn_%%E`V+Q@vyWH|9/L8JK^4LF3qar0*\IF,.qjl3,C|!x?Z{@dWejFLj 90 ̜~lQ^y' qւSsn69Mjd324BP\ Oբ؊ Q';LE sCkFo rd.b ĄX= 9 S~)i N,V=!iW&bd`[NA粦Юɸ #_H~`\ȬWGFDEV&G=G a }8Sp} a 9{5MɯRtT6}q@;rh٘= o=wh`Oyϯnѳ|0'{}+O_M6CM}~|8ۿ7ph_ۻ}_EBO"=߫V~4<=zm1 s?]@~t֓ЕT'2G>;Mv>;l͗ppkuoތ{'y(ui&ٙ-Yoܼ:Wܫw.{O~^G w \|>O$9/[--=O)?n*Ȭ_>kc* endstream endobj 321 0 obj<>stream xYˊ%7 @~Ȳ CCIgЙ]b20|~RuݱKn]9t\btޥ\θ An UbkqQ6GOq \"JM O&}q#< ʠa\"B̄Ap!y&bMr eurB1`1<D0M(&x:!Ђ 1+'x1TMv1f%~DZR4LБpػ>,E` fN UO\fgxn2eo}Gi5$ߦ^Bܩ$Dɺ]x(b)|I5yU)0h6^'Ar*U ¢fG |8$^ #9&5x.S4x.0uS23<7Yo# Tkr@$Gai9yU,銄#|20@%"֔+r<\wn?z|{AEz5bח_v0eFYf?~yyӓOp˟Ⱥ8\eM/÷Z{in?~?MܢRcOMPLQM1bp"-frS6Y36T2W`=`ċ ǥFKYbR:)O ̶F¤I8a&W~.{m/eF]L~(*~(ub.tԆ< 3F2f5SU 0Oq*^  Rm~GW5?u.D4QPĕfJ|9NZ*V ~FN9^F΁֠6L59RxL&fb5h˃ՈѠ+3[nwq]9q>dIXaZ +i-Pް3Aipm ݈ W0waa=ŋ2> 4°zX@`]Oswl*QA+>R)g[# +KwyP@{OK2aJl- EV]2ae5KFdDžѠ)"H(]$HО Y9 3D6KZ,-._8b.^+KUlF+KEB)^UV U[a[R,l5-&٪aaldT;Cʡ/V9lԴzhZ=4]dkoz\|fFFzh]=4C=tb2WצC"[{+8,Ӊ2I''BRꁼ`Oݸ{2y%ԃ땷jاfZT4ldt;Vuԩj;'Y;K'4+oKJ=[p !SZФz8%\O{:n,Sb>]MR{ȝ%SRrR=K3BmIp6C KstO)^<Aęwۛvߧ[0,4FF^=Ez=ŋx@Zs endstream endobj 422 0 obj<>stream xYˎF `G7`,0 1l|~lZ9J dMi)e )1T%pԐp}ɁJ \ Tp,AHAվP EBc&d's4E4ܢRPTDdD~ q2,'FB@ r@nCnSFČ,sA~T!d)ĐIxzVF j[xDCIF'(/Iߖ qKN8!ACײAn5yAU1$CFRI[ "9 N ßbdvd i/֑4rЈ}ӗ?=#S,>?|ϗ]~3PX|eYv.<,L)eY8{|_~l/q"(UW(2iD-ıQzk6#18WBhW=MsHRveHeR)N%-e.' *r*J^'U逑*55D'ilH4V9(x)yګKcL^%4pXވڀJrĞhCJet*U%wD/7R4ҌQ|k4.|TZWGzQ]aS̕M$ɩx},8& mT Vn>prC%_ؼQ&tO,PfTJi҈=:hQ%AӃU6o w$~z?=oܷBp٩4)qۜJ{N]oӃ zC%_زQ6UӃA}dR?= fY`hGOڧLҮeNO~zP?=oҷBOF~aot,UR?=hiL;eN5JOO7Y[P]٫4ŘQON{Aݦ*ޙ Ս󽒾SOO7Y[abZ*Mnfz'шJOO|z!U 5?=4?=4dk ۘ'ߖЇT7 c56͙+/73D3D;!vH6157C+tZns\粲)5,iU33=]g;Uj쳎=bHW6Nz1Р"ѮJ+e.fnHPv;HnFIO̎ZeyY^p ^wZ4*ˌ}N0%Ԣgvpn۝N4o$= ːŕ'>stream xn7 _E/P@ԽEVpݢߏ3Hzk h!O6y\qYb'C{p,C0pɸIsd+fSRĵg fDA_q/"h\`q1|ئN*0qL`9rb vEP0b"Q4Y`GM B {agXNJ Y<ɰx dx<ûN5@8 A `B1yIXIXNp G!K|,V(p!*"F19L9Jpe2(IH0r\`9Z `V I~ljD6OXg؊u" WA@tvL,AX fpņkd3B~ /ϲ2b`0c-!X@c,3F1]~ˏ?[3YoAJ/p;)u_/^?{quO_zAfq[,/L_YlK2j)N,ˇ`Of&`;~ʂ|%(~3n+RBy-q^{mk^\Α+yMHOT0O#5I<"aM+I:Gu$qMBG$YJRNpO$[^eOj%ړ=?X\2wn_fP:w3*8rVgJeENZh2Cz4]q$P{1:@'Er1RRzu@1M^cKʛ˱%ZG+Ylҥ7Na|DqTg9ؤ=L5eҔ z]ULWj 愦NbaU ipj]exùL `j&`3i7teo=>,ZNT|UrzӊbkrٖyULmjV w+uYµ^ m]멹L v>h E?dPʸ,e5bϭ)ز?rq0i)&T@cSatV!]#IS)t0Y":ig9ګWmWֲF^ ^uIBziRA a\=ؐ;^ap'3n;BpfY3”$y}֨0g:¬+tt]ٺ[gJ;4fwQg^vunrPYOx'+>qgI|Or]t9.zGR|"4xﺮլr%@^G(Qjv룰Ѐ2I4&w5JՊ;U]PN$xQVj܀2yIƣ^ejdk'BUOr;af endstream endobj 624 0 obj<>stream xYˎ6 @1%I:EfWt, N~~k]\X!yHQL˔]x Ya*SuT]̘%HGǹ\fg'!TWbq5|uɻ >`2D.駈bI XD? IѤxRq!+T1(XY Cs\j "BNT$j8bx & 8(-jNfU34KOB袢34׬bG3 %` b3.\LvI1`hpCYJAs3^b0U#h&O:T$c1)dbR)qiRRĄ%ǠPd EC 5Lv K.{ p`T fD?n &01nVvf:f@s^Ь@u&zH`lJc3L *ebL #4ph ,0Ey?^<}y{g}?_1//Ny/^nSb-Tӷߞ>O~+irVU}ֆJB j p58d1pKp_C=8© NA+kpb8nS'kpR۴C\8t X*F4Gp58'Y*F4kpR96*KTD҃c%*C ^UʩQ9%8\9]2u.t{l me7bgZ̝pA,UjoCS:t%[6\{쾀hбVJee@+Hj7N2m1hr4V,sʨ4w{Oީl)=tX*Fia$Wh2aQnm++BGϴha6-9;9md3L3Ι"O hu3еn[ܴieBh-ށî&8M vm_aҧx=ޜvQ̥ӲrVF# ,NCIjf`[ `d|:ahnXoZ!kJ0)"IF! Ӧjig.LXYD؏Ͱ|GXHMA~#k]2NwZA9Ҙ5հzSruؚT^ I6\0zN#k{-ʨ݃aS1ƒ  B-v͸IwXs)֖)i-猖!kXֽSoYӻNCIb9fn_p\-7We=Dm i; QiCNi2|۞jbj鰎vm`褷+/%v+rK<{_K缸3]x" h<ʀ7ˍדә/(fmЦt2ѡ*g]z\-<>stream xYn7 |@aH MKQinE=h-~^:=R3 qIHR)WMבz)ZRvȮ5uIm՞ \9I\'vդͮ#ܖS44+B FO*4N!BU@:{0Fҁ@֌\(#yC엞(7kp"GCag ET"  u$3xH `6Pyd^i=y!N9/VE9}{e*O/7eӿˤ_?l2Gz~/w~-݊!AJ5Sׁ5Jؙ)2Lp-owbdYfpQ脲Ҷ{,e/p{ש.ݖ~Y9#L2lˇLmϜ9g {[Q脲 5kFB9ZuuL ֿ"堛H~!b Pg9F\;Q4JPٳJtDxQ"/D^sjPs e`bvPޜP{J_<5i?;⶧h"Ŋ . &!V0 Nlcrw]N(+a 좖jD7>wCLYŠ/;U/dȱGTd# [B %Kx$:! J\Z"Ѽ`)/}y2,z%.Xi\(^ /脴 5YB=(Xʰj!T4?(#hsˋ(q3*tC(%dz NH+krveRBP5-?Qv:ℊ.x"TDY(^B /脴 u SW[[ƞb?*kTBk 6vJi*Tx$:!ZPS|:1X +vjˌ*Seق6r҂|fpTBII8x2AYǧ;K=qvUf%<ƛz8OO)䫐脴bkܺN tkE.%͔ L) \h\δ/$7.F2C}HtBZ)_Ώ/BnN.*ɵvW)BTq]Yiq]Nq5'5f/G&Ō׸u;?*>e)s\{?S~!̜>#Xs}՞N7>L7HtBZ,AMs.h|}xq)M>\8h98$v> 3> 2|8<V /XCo_@^~ f M23x6U?w-s Z= #T#p endstream endobj 826 0 obj<>stream xY]7 +e)YۗRB҇o!Mp3_KKЧ_>.E%c[ڒ=×PVc⏛@L w=Խ+j%[džk@}B ui)%JPBʋ8b8ZYTXC@xjh]7sUCWDO,}Xl-[w*z٪ l_IHZN/[M?H\ endstream endobj 927 0 obj<>stream x͎5_/].\RiD6E!;"YDs}ehwqUa JM[]SB*9M[B.J5fi}Īslϔ2~Sf1k"=*(Th` 1{T! bx!3B d>ZjgZhR;Cgbxsc/ȐS|rLΌ2wفrCNrZqQrvC 9G#e(kC68lgsG9_,m`r;ap<;ڕoSLSDv -<9 rI ;,\fsǸ\*vϱ4_ie8wc7‘ˌq60dv8 - Nq6dIr43?.3ƥc\X!סia2s\:rmǒnXXcIn,3ƥc,6Wј9aia2S,bqPL^^,3)Ŕoj t1I/N /3^wVV\g3\{<1#N #3µ#\{<1N 3\{3õ3 j@üa!z .yÆya:Cb,sIÅy:#auIiLsniCK98?r66&9uqq;"ˆzC\Ϙj󎁊8mf>7\7!;Wqn9<,:<|O|]9H~eo]iSK37 v$v(Z t붎0p4[=wVy5^!cT鬶:Ŕޘձ?ʹ Q}X^ Wb̗NnZfX s endstream endobj 1028 0 obj<>stream xYn7 ~@a)  IKQinE9 h-%4?i{XZ) x,;?8:(DpD%ȅĎ~mώ)*Q\]*Y pٖ"b"bp讨_5a u ; N@ zVJQR$lU~۪U+g TҠd[ wQ9"0Jb5T0B !ZMHGEB‘JU@50!8VBE4@3P$3b!E"')ZJCQ@(V%MYXLaw%E//__={z^R{|+ϿEEo><>Aߟ'OkMQӷӗB$)E>1ģ®h8vra 5']kxZNqRn^`D{F"II;e|S@+ UUK=ܘ?&3OlIDBP*js a#7<OmKx9xn8) N0t_}iR+t{|]4ўb;jE|Ψ̳R]4TAÙn2y(Mzw'dh=9684f].|J psmu"9x[<H+4uigk}O샃sE}n ;wa~<镆rxn9MLmz+鵱4ed@cr^8C;/b;8wO9HRW8rZGXZp,}ppӹ,Rlik6EfgX0wZ!TD4ЧY;X[$,k!n<!;! 5tVHM~9]! \5yiЬp]Y]rk.w.㖞N5Z'Q76z0f֮vNIAo41eThI@*{oY^PnwM)CR~0[>mf|vGOEX{9jbrk50Meoޢt-O*3:Wfuz8'u '.]78n$H6:\H4(76/`@ sFb$:$8$pHp˰$mRTyi7iV86X˃bI7X~ox*B'o)g?ԄAv^1Ow7 O>stream xYn7 ~@aE  l܊r!@Q[Kj4+iwdNrwG"6λ00! " OإLr6!;BN=g&$&B{#&!:r0ϓȹ|z3W-w}!l8D(F!&CJ>N# :'C)h(qus0:r64+3ZC6ԅ\H"EYD.ndفDU7fAV#\@Ce&A;UȎ$P("G%EIAT %hH :r&l11yNS&elD.KhiymE@4T.Y lbUH.%.ߪNf>$TGr qJlk+Mr nHEbǔ$N77>yݝ?=͇/U 7w_ʻ{zu金8Vem(i,T6N}vzU+&l6]Ā4Um<ևv[~ͻ?,zƏ-a+\]nR|Pmwn$gY)!c7ҿt4hi_Z5S 0Z)01w޶ܻ&DA agPf2Vn|_dxE6h֢~„:\}b۰:?# endstream endobj 1230 0 obj<>stream xYˎ[7 @1(HL7EYd1AӢ_R!ʾ,X%Y K|%z Tj$y5s>'J#FeEɻtYC1GQ@Ő Sk$ a'Ȼ]eAȬϱ((^"諔Z)5fXbWDb]&Œ,6J(TK͊YBнeԚEQyh *\Dm.% *%]Q@vuoElETj P]E WB;ŬϒH "Q6;E*ʐxQ4CE=5!&r %+\SdQRŋ@r?-ז |S'] 76CN=7aJ[꠹kwm&]axLz, OlU6o˖$8)"y3zš] .Eݬvum͖Ak;S$<$9~,e{;-8_tRVpUCDK)ܝԚ;U][ quMN*I?caW{3:>h#HTDA7b+[uU: Mn#L|b9o7KMJɒԼBz_jt9.̩9M qy:tc nOwR k/co..Zcȧz՗5>4?;ҔqѨyLDfiyU&ҧm 2 g9j r/.-NzwEGQZp;{k~,_ϲ2gA6ݓw} wm mG׮ôkU5c^ں'ސ#zv6+L;n ,]x˛p~F Tة 4̻e<1 ` ߧ!7\<\d$5${;Hf+ -AMBtWWxuGqϞp{KʠUv+A9'jAsEV~=uq_j仪]O"[]黫;Y%pTw\_WԙI]Te?` v&w3ofEMGQuAg2Fԕ2#Wک;g06/,HUNx tZai^Z(X0AC@ؚ<[ҳv endstream endobj 1331 0 obj<>stream xYMo7 +%nRA[C>( u>jF+ѣ6awERO|yO7lg1!bDC$Ȇ]` &DÙdM+69gň$j7 ?pZ8}udC0co8`<'JqR<3*:J0AZy jyC5IS u(Y3$b(y(exBYd;/jV)O2"7 "%[XY [9#FiFYQZ!!E3Rb.VT 3BɈa챌}~}<,B_ϛGιmjKq#@3ʋy>bg;Lg^dvpvKPBjVJ~uNb U:I~ ZۓZ1zL UUr\1Xla5RGGƂ{ky (?nS=9z'P÷hY†zDߪtEPM4Xz!9b4kjMN&">HU{ '2rcRR$(7jrx~ǠB.Ш1ُ zY+םqtv`iG>\}5W2'>j_A6}cŽ\ UUn>qIܬUJLE7ޮd%7U)(_<. {MPq5Gs=pqeN:X9î+jG&AP>d'w}/Pn^'!2zUŬDgyܢ(Y([WǢT()j×z(M#Y~4HCv)*p{<(. Ys} M@rɱ8Z}NDI{J$KgF:8)]gjσ7f=%x$).E|K2lfV:?'O$eUQت]`^*FRn&ih׍saO)I'x;[^"UkkMg.$ ;)m"u0q*nR4W|d$;Zs W_<U\ aq? 5ܹ~Br I$_Ӎ= wiN9۝-oU+IE}BR>stream xn7 _E/PXD&(4rP4@}Z# f=+"?3 )F]H1@u.@AP?QEmP\A}Apvr"'8 :)e+TԓmƄ_!ϊ p 96c˜l6?[|2ٴG[ FUMs'+"GF)E#$adSL6X)(i:fѤ8h1H-FF-V1 Y%[.,}Z$o12@DDx0Wr-I# WBD)ɉfҢ*(b*Gb4e%-F.P`1 a-FX L,Fa*Z"YLi1:bȘ G !Fz!FAp"p8;&cL~7;RSrvesbc9yT1j0br'VXRS'y Y$dU`hC%Z#yT% LDSF%׵PC *0#)[G .lD!o<|7OG}z׿|v?}(sO_|4?G/oiG1||D_~߬?і3#T[-7q )B[~"٣"~]GnB5\]W׎fG\^? o )mBZ, f0 ^VvdxHXs6O}r..7x5tKx $ zG\=,zU02o)VxU.wZ|%"QmE>stream xn6_/P3CA) ͮ" / EgF.lSf>RTw9*]ȤqG-kBu ٻV.WBDkBrlsv9])Y j~0OQE1h}*Z=Bdn~RD[('k -E"v%i1jr㲶ů.Fo%zb"eoCr=wM!E[(eX=vɛ*Bzťhiw+^$ &RvK5.h8 H[fTMsE}U$RtRBh/HJN1@3СLi-.ůVM CF6-1F4\'GP(iك@ւ%j-v:Ъm!Fpm+Z0hccb0FM֋8hVG8DqҘr`_vlp$\ĎEzp\,.cErͪ0pEQ NN(F3"%" oīB]A]BNd[{+huu9n }3 . rj ;aѪ Lt9tg}>iZe4i{&~˥\{,F+jIMρG28u@4 #c56U(sYnqmv#@Nݭw. Fq]nဆ΍ok9ʱB9L%1_/Iz$%t;2jCW=+$s/ J=֗=ng141貽 prvT!).ɮщ7&~Zc\ozy~FgZÉU?_:1 uFG(z͗G9?xd{"B% ɪ}.<1 FN g\Ӿ_; _&\N2S铻\' 5xDxe6x女>n_VL\N!rK!gW4lxTqHlRe T qⓘ̓7l-e:. endstream endobj 1634 0 obj<>stream xYn7 @aID IMQivEYxh-={gzaHsHqP(;B/~Q]M"gɻ.*FtRvը$`e Ie\F/3Ȼ1P^M"Ͳ{,#A `ҪhQz\ I]:K).=tDu1ie{>˰PәP*0|T]G 2Ʀ1sqVAA(k(VêGIq$58bEfXEGGK) Mq+iMVJ[%*^:.iuZQ%*F oa (OA,U^r9Ȑ[P)DK+]W`GMjG.@&2cx/QKːOV%y¡BIF\Qu eEcQFPEH<x8YSX>',o/>y=pH~{O<+WWS)-&?#ϟ|rX8=^ZqX >2g }=ۇwA?na/Sy_NWqwքPv<,$%,^(uJ%G4ŸT1/`ę3YMqK^"\O6/"uH#zA$kmW #Watk,gp/]aYq,{'LI&#bGFT2U@Ξ uvn. UkU\*ss]''V8=߳yu]eV,e&ÉR.q.A5m~m@sM,NDN ^a[u6:Z)(S :IASMjFO%_'< o2J]g=Ţc&;^(0YMDa-C S+ gvDdAM DzL& d,[й,)- gNV :})Y@& d, '2LB]#6o@ï2Eߵyh< endstream endobj 1735 0 obj<>stream xYM$5 +h'viҲ\B q$Jˀ<+qO$N:Q!Gqޅ+6#ў]$FpDmKR(9I]E6Y jiCנ- ͂e%iiqI[ٞyi}I_d [࣒r(p݆:hI3%"=ɎRPx@e mF+ -(#׬-Q#Q<>bh ƒ ZEZآ*CRHr!jTK6\^ +d65>b)%2 S)葔DIH6YR4bcx+hN2XNIH[Q5Ყ4U[c ƤXiB9֗W'PoA7L3 \rVK|Ŵb4Ai<@+%8 jdȿ SkA!E&وJG%BCmѣ(1ڌ LzdufmA {?÷>xc&>_?>M߇ooYM&0;#> 퇏=oE=w[w~ͯ ?TCcNLYD >D@-rPP gN2 q l2_Ӑe~BwEφlφ{d\$L#g8(Հ,z3ţVT/[ASâx/&EA(DA 厵FAيaنV)ӷܫ%bo`Jpt%߉9j;h+N C5kx*<1n ](}=]Av5>0l6,MtV9^.M|za|ELԎw`[= tkWud5{bM9R7t^Gr|=dLwEo;^DDр"ɋ+6lUoZ;mw1U %rcq]xr6]Inr:L&H6A^XWޣ m}~o4DB?y}4W4:VCԎUE"z{B*g}{6Vz/6DUk +'|m`LUFkzRt2P 8J#Wsw){%Qh,^oWF[ԺKAL1=nW6*6ad-m7vy &}"k{ endstream endobj 1836 0 obj<>stream xYn7 @a(ytSA]E^( u~~ICȒ.εC1r(w`qW ;LBpIp <!:$9*Q )CvUOTu_՚Z Y-i^%9#1U-مr,ZOB4=Ab#W&1.U6D_.Dy;)ŠϲUKRfճRIb}ȡG"؉R"Y֊c}NȫEgKrH>yFi ^rp1h` KƏQ$ϢD)B$1nRv|HHb bM{{Kō,T $f=sT$UK j4"]J[4,.(M+ IڰS=AZHjPJ _`zbU3GX3jCB HeTF0HiPE%_Pּ1aR$6X]a)ڐjejCՆXR݇Ϗ?x[$ /^}GݽAP ߽ǭϟOۗ< 卍(I (+l蕱v;RׇnDB)Oi [И"" {;_~ˇ/w BM{Si0Sh[Zl;D5VY?s߲ua\9bv$3 9]fߧMv%?sٌ{FEt_ɺx ;1>uSt8VtĬјf5C0u^8&<7N](<ѥ㡯Qlfi=/afؕ7,B.ˍo=-+KA`Yoה($po/lݔz\ϥU2)ĔA)־oB3nіz|M{o5^,AaPپc1$ c3%gk:7BƼ4Nom-wL7ʞ@/Gb+րiQxRsy9~1xG:) <txg޴*H3:9bĆgN OLtqoxӚ w<{<Ө⁥RC sBW<Ȇgx)s< |N͛\/'+[< |VO1>֙R?Dgh|>W<}qx W0{-el\{U{.Ao-;ƖDli\; o endstream endobj 1937 0 obj<>stream xYM5 +%(-`Ry ~>Ǟwr3tIqrCyjN>_8@JU!Ȭ;8^%'Epv)ژ2 .g,ޕ&$J:F,/B""P`ѫɐ & o^$ֹ*fUP.2ɶtHڸțTh#;^m.Ţ2< H=cHIQ.&Fe05W}TTd ^A}@E1fUsɐ̧ȞF6F1Uب<8EJWwr~s:քp68HQcp)8N $a Xid3`Ü|ҨRqB悭$(+!HUrUb ~GHٞF 6J1}%5I<$Vk`t o\"$g {E@($!5DL*.6͈QbQDQEب6OlH'.+K %H?"z~/ ӻ_>@(lYy}/ޤC^Ƽwo߽C44J@E^??_0o*m TzzJM9.+э ф98 /A ed#5"{J QF| P| (PlE@uD瀤`K``晇һ=1rh95P~ JsPZ.^IkH`RsHZִ+!5$|44[eMl` jQ=@30[Ӛ٭Tj^KuZZ I1J'Z}V|ܲ>F9:-{%&?+5B'Y`"lYYK).ׂ!ݼU@7N~1oRTE ~zovݟz]o۷V$UM1{߷N"5=Q-w,d[Ly@"li}u>|N$xF @[u(md9w2D~:|C7D۳fvK햁y= X%a^0]ʄg=;S&G 5E=w}5撲7|d Z?rqvxM8)3'yeUEv8i$ΫD쌏E>jr`~]&]dS*ӽJEafK>%n[t,{dtR'\{ٺ*nB:{E;^y׫bn8Q ]m%!"2X]}^TUç<ڜ 9u [vn\[s]@o,,Wra?2#qW3tǯF»ꣃSl vx,\ف,^oj^7LU:i~ 'x&y%KnX֧T;|n[,O"otQՆK ~|Rz,x)uw^ZNlVUi~v79#ފ 2͏ >뺢Jw;vp+LY9XSyxZ VTjqVm۴Is8ayg:y4̑u^~xOz:c`>stream xYn6 }Q?&0]^"aC$Ų]g!yHѪ>k $!pQ҅7ފ.L&P&"Le.XD($3V&*!rcʳdLQ yt jbź(FNco(Y5 | -lPQW` I`Gg{ m Ԯ-xK0"HPC+Ru&9ITN#Ƈ^X! JيYd'[3sKv&XWy- ’.yȵ+Ʉ% B 9!+e)YJ=" C +.`#SaBY*(u l"!ݎȚ4DdJBM u@K QJ3H†XBQAINpV?4*6sprb8"҈ά'OXzf!pX:F9WEqhM\⛢9JsTG<,4}7txBٜ9ΆyhKX[CSXMKcKXf&)7,,⠙v*'&\P =s@ce2Ϙ9kR@iK1\3:cL2I T@QM5P\\y3^;lT4>kt6WjQ`%r4)mKnx:s%xcY6NjX :uNiJoxϤq.'?>789Yf֯aq.P&Td(w=)V@3~X-6WI{w]^앗ߘgh*u/xº׶yiM\;IM(" i/N>-?.HYVtoS'@lF܈Ս } J Wd4)E|P,'-3h5ƈHd=jл[7mtKJ>(yYӘ G$ĕAJyԚ s`m^\MbchΣnO8N䊌M7h5V;9}s@)Z\G|KѪhV5 ]:T);xwSQFThk느J0TNh;ɩU?On}F_>,x,.KƊ|+$\x:A^q6%1KkifEcR=,d¿ /ΨF09T8ѷR#tiO.K:T?*7^0jvHd=> + VѬ=+ {؊t~b篭 2OOhjBuw;]kzџrLO~ P,V:qÓY!SPеY_ɑߵWW??+^OѬJYk,iEGؽ1qN dZh^2߄䌤k7njlzNҫjŜIYi)|xpFU,6nu'e*-kM6Ni endstream endobj 2139 0 obj<>stream xYMo7 +E0܊r!@Q[Q3qzHkPoL;"9bRIPpR#:Q#K(.r0wh,,YjF> VjeG X[jX[dKt[O^.G9Ct9jnFZ|A?xdkةb0uexGF-q Ѫ|5GY.}]y:6k>؎ZPK` ]yK}[􋪗 | MIo$qr5:OL`cGr㔘{d(Uq!ꌙML)Nc@.{Z0dL0V&oz񾍧M8Z{eI6oNߤ9d,' y0VYVNK=ur14LCv)bX4'zX Qzo{bhrLC> ^LLLXY{|۽R;[f?Z-d\:Is9\cSKWW4G4Gc]Y"1^i.'Is91;Յ-X4G4GqWTE ^VI%y텆+x6g/+m^](F錴Iv.;F}:`&mu짎\nNK֤St:GҮz9eiB% ^4'Iyڏk<|B\un<ڴCQ4IMMƞx8j8|]H1۰;P~y`f:HQ@pL|Iu>hnGO茙w twA\ dFqqf\1!2__xuJ}۳&ȕ5:ܲL.F9Ny&;t|);ꐱQEF:Qv{L=9 uǏaoC~|F1 d4qqjɻ 5V0`.]S~i#Y{_FLЛ>stream xXM5+hmWKV(8pC$D ~>cLX<鮪W>޳3xޤ$'RC0LrHMpbBq8krp&Ey'x}2RM`*s6)[(Q8 E"2N{X4GȮ Q`x`O6N `I\M!Gi_X$hPYe"Z2^)QPd}fǫD0T>'ClJ-PAxC)FƆbTj@ۊpن%vT"K"$933daN)Y6]}p)l$m} 䩳&Xpb B-'2 '6Ap h τ 8!ik"׀F,Fbч ى\%LVPSZH8*Mb"U-d >|䪏!էdb$A?H6Rb1WQwxI֧(~jݻO|}ˋ@GKZ^O ||ȯV8>?Ge+\S?×;f"o[ϟ~e0.[G ӗO_j>J#06*M[R )(EK莤hAAИ)sϕA -p;e  Q E/&ƾ`eMxKMꣲsq:=*:P6n[=Tp\*b[@v[$;ɜ]tw6wǕGe{:x̟ږξy~39[A"6oSF|Z`",955w8=*Re3Dc|;M c,+hU*+,/%XxDsgc(VI64J{Tv,u 6,rY5D7>ƞU]YDŽ2ӿ͎̋t/Eө <^?mVU oC|GCG8/ڴqJ, rQxR* Kg5Z{s=>s2mLfۨ/Eر׉r;?֗TVVZzg{$tt1bIRn I%UܨA^Z Af]W4E87E}Ly9Jz%'|c֯2䎅zt& 7!&5qm?>stream xA' ǿ _Zl)Z)MTUV"Un~>rȆo0:0Pp9@҈H.ڕa}8(] Y@8oİW[\]'m%iڙXb/,2B^FT"^aIQ9:`2G-#+sdVn9 ior&4#:.*A >sbB}NDT$ ګ}XUeV,%^r{QZ\'bu6 SLB("=q8_>WHY9r g9r]Q9JI=$佴aAw(@.H"UOXC^HKUPjELQVg˜ƃ]\V5!yEHҪAvD dXBXB(sT*V4VZ],]]V%U$)K$.ULʇGs}NHT/DdR=N{ӗ?<$) aÇߞz/[ߞOb_?j4o?P{|g]:"lE6ncqjq58k`68p%Nl8 G}Tpt x^(JV!_]f,?>o|}~*~+5cSsdf ^؅F7^8!qǨo{p8 p;Lu1&XgA;<1R;r8F 3ϥlLqIRgO8yY`pqrÙ֫2.\7*V#-xGDu*Ot&D~ȩζv^TB9mHhO Nj8'8&CCl sLrl['# s(;]Fq` sNsf]\7&\jwAi.=0_ڼGx ^z'h+GΏR^/Y-՘իs7͉ DK{'ƱmkYV>d?J Sڟy[19sVq (Lbc SK;uy#PXLtӐgRӝ蹴+z., _ ySeo,RKx. fv``Yq0 {䳁ie/J8[Ʌ4- x +0Mξ~A kXUR0F|`Y#bh"57@XaM7XlO\(xpuAC4. 0p"_ٯ碎N![ʓpAc4iy(l^3nzb7\ 僥8_e,v@\/# 'T] b[;ح}pB[@gc$5:Xpn?6'"s -i(Wj`nWkpA{l7q;"VZ?ƎuM4 zvDkU눖ɰвGÇQoڅ?>p endstream endobj 2442 0 obj<>stream xYn6@0l6aƹb =@SMI&{$:ָ_UdSgcޛ0d,Td NpONk'L3,ĘeM$`2yYDS>I$~V KBb%HA\G* [!$ܣ U1Rۄ9K* 1J4!M '%5,e_] ?؉fB4Gdy&bRs\͈Q|- -)Xp>+XɯXl%3W 3†Jb$'HQ8Q@**3ˊ! *X#!={B V@#$U^ bKD}#U;*h\ ɲ!)@_?uF+WH Uz J@$!X\?E3ȢI(B̢BDC  j(?&*jM ]&Pd01 Y,]xA$ n?~}}_n߿`&O~}>stream xYn'}^2HQ$(ͮ" /"UUg~{ ,lsmf9g5.h"O6d$::S Z̉Dn7l˜`8Dm\ddG$4>!罎F{C~0ꍣevfM3!F*bdR 1輄º)6kR S( $%'t(Eb骲.#f,Eג4Nִr(p \ۄ9OXgB,F*"f>D'XQ&x.1+CY4#A \ Fc FcG B<f@1B"])lCƄ)B삎#+L!.h}ZGlXR(He`42~uZhT:%# 5#. Y[1\al.tΰ/ckĒ%s)lK4 'yHe}1ĩ?72zF^(ͻwO=o0HIPӯ\CFEܘ׷?_߽b-x;ۗ/_zޱ,JoO[/YrF>~wX3;Ê~|No6=mL?eu8Pm<;vD{_ޯ6&nW,y;!}N3Uvl;gO9 b"hUm "\yp%5 c; \qhq]PhĊb\Ij%r5 Ⴋ"c29{g;d@&cgqd[R׻3pv'/X;%?ۊ82oM&+˹v4٤񊫮SY;*u/׃2Q$OdCh4٭ڭ"~Y;. <"cXS.D~r'2r'2rׅS=1'G ajR ؉Y2)͌l sb-v!npxGcf[gtl/7 ۜ̉Gt-9s6pU߬roEpt5@Nz*=fp% v%tC:!]o(@CȸlvO(I{l5h0˸f\&JK'C3w' |>>T[!癪o#$P\.ns+/%O5ν](?oo7Cg :__}ZR5 3U)ϭ&vGX@BkGk;;HD,~}nkHV[+)̯0b3rG^Kg~Z!Bcc>stream xn7 _E/PH(4|Ԁ}ٕԃZ{D~~c !$mu' 6@ǡ\0;D$CQ[:Ҹ:B:uŏ QѹGeg)QXXx9$ۊHlEs`Qt͐eU\EWh  Т$`o,I18K½1iJ)d,V%i\\&GhPm@eQYoFG-r>C9"hcD$~YsH.Q4Ga?P&Ԕ nJӆE27:b+.(3 ::xLA:R=Y -hd]L({$9r,j%ud $Aj:T2X$EˁPGؒHs$o9Tp~9[Du-D`9]TqH;ErF*T.*E%(׉R.hՑ¬WEu캠9rnS.8kt/޾??<=.?!^>}}}Z |y6}߷ۧRڷt&˗aY1Z?d6]G~GΣۼ?nEfƺ| @}ro"vvEj+7vIw/G32ԭt=J]?OQo̕ᶉ$tN"N4[HbCyNIrGl_"$Iw$RI`*')]r; `s]Ypx hFJ&Xu惵 +^'XHƲ-0zN`vNaێf_erg1 6L2&'4fe5Y:؅A??.5 EߣRUS­B:m$mC^zDz.O}C>@ W/Rax+Qfw[9n:h;`P 0+s]NaIanzj>5]85U6/>!14UwMFHly~)aWHMNL7^Oi}ׯSr>stream xn7 _E/PXW^ÀEfWtHݢ_R3HZ\$~"R8b]Č%r@ERKrwJr%w+( c: YPX."w GmEi 1营:<R\{ %)B/O&`T(6Z@{` }}*xR>bN[LQDDґIA{JɯR/je^tPɠzƹ%vɗwI\- C`%R,a ̜:2r K[*TWlF0zOlƃ|r+3Ƀ앙|q9Ƀ1m#HZ iYA2\ڐP: z:LjW =CW|HZP+E^ -+){"jWdQdRT%$A.EKQll~bCe&-AE%^g$.\_m!$ޓԈ#:H@NjC_D4u(V,6q`o>})ާ} E?=|7ٻO^}^zi>=п='iԤ-p(_Iv@T Hyl@a f@_kzފHWtq5xpʳG6y5m!2K0.M0UԚSR)k<4ATqOč'kghz9kghzGVp u#ghr7,ڌFДS%o(GY(U"(CI 5/6\ɱ,BhM\^i]`4&Z\-ssKF4K+Ս^GP{.b,H(v^V\ jBBFKd V9Q#qyn3䅁qU܄̃ ?xo)~m;/_Wf y;<ddž$Нl%#/Gsb|(}\ǵˆ{f!402ä0^68-^t"p5X|W>cSp\Дbp( \~Th:`TC c04X({Y6?%_x!L ƒ`sOb%lFܑ Op\',ɭ HįCFe\6v . {[YnypF %J@ ysDZj3:vv``&50L^]QmhƪCQX/KhE5NDSW+4+ܽ_ai.Nne[~U%6N2i_Sn9(tIfqԄ4:mB&m[&@ɪ4V4P d]c7;o`3X$PAiAr%ăvU,ZK37.BBNUv*N^Y6ѧ*>#8&4\*mbxMeR/Avr]2 P>I;'5Өm}p'5sAᓔ4 My}Pz6P*w endstream endobj 2846 0 obj<>stream xYn\7 @anbwSA]E^(ju~~I݇{bH:Hg`DujB6}^%rݠɫ ˷" ZT@֖z,%AEt,Q@*c2 eU<( YJ2.8#|Vthd%:tDdj%C^W^VX,/ 9|8C?k=+(ؼBY} :" E1ZVC +DrOުxPp1[̟gNV gPYVBl !1oERYYL.&YqD,a}^VٓಟOOubBY > D[ѡq&ZeS0Hg~ݧ?@ӏ/^$mC짾xZu /+r?ɻp_o:Wf K!I}~}w70/Ca"?"'K<_,~m)MߗmSx#xwIƀn(` Mh89 {am'!41#:gL:GÆ /Cm|P08 [} # A)bѭ^}R8BycTBP;|/{hRD %jv7h\Phzyl[rDu8EqT+*zzԏ}cz6.DVG:vq chd\ {82NHk5HJw Q^?d\=cT|: ) tt9蒙jb,/L9ԯTT}bC17۳Y/Sm|O'r#́Nl[!EɱuHpJӞm70dqs[2=jܕMX|1:(4ɝ28.jPfc*~ CREh.^4 xQ2l݂Jo|İe;zv`gr0g.2ңOL%HM;) K閤T =fӇ4T`OQp-cK o/39ujo,-Asl94 }=A_7D M2qp:/"DݱПKу^qeZ&rDt2R40"XO|wF: [V fa,osV~>_ƅl[_ZبTYҢIæciIn򜙒Z%PJ8' 8w -V/P^lڃ+IB Fm]Et}שW5cbPBtk$ʎjO:,0y2'$K=JwώpkCɨ,MG54v*K4AQIq ]p4j8+TCL=*KˤvfX endstream endobj 2947 0 obj<>stream xYn7 @aQRnRwSA]E^( u~~;݅m;#<|Hv9$c!!r*U'. VT&`h/ﰉTR%#F.gkRoL&]/W$.oEC !oJd(PT=f݌;>gHH6 FNe-Yl^0wJŒbIPU$R$XԇzA|тɕЭ:WwPmԵ_do|ŒK W,YXrTxklA $<A  )@TcH|'&PK&xUemTVMBPL^Z!k66)>$&Cvelh orD&X΃I`bj́F_OiT9y 1kBԄŝNduoPϤN gφ],!3|R|>| >`!"dI!̬vlH$~qrj ngDHQ`xo?2Kbd㗇__{E0W8]%u:oۺtϗw?=?3O`P>|^?@ե觧ZHE($m ݭ_UPϑ)A~.<> "~~?([ S-o:ܟ'ΰri߁r#^Σ:8' vSiYvb\mmU:\P緭wš֣6fGU0WyMܡHŪ86&=e!tE@U;҄qvo`27&LF.}#r& c{ fG<Ijp9EIIyg 櫧:pݕ2ys0#E 5Gq$,BzXVEdf(OmiU}ƫtKUQuIE] yQuhñvUke'Gb(;a' iCD;jrjI5^v0T֒V%{&Ԋroqf(;Mr 7z&q8)%ںI/s=u['mb<6r\NYr<3egkbAlŜt.< ԕ?3ƣ u9&ώR}=(hU;d#ttjQsuWY&2Cf5.^'gͬt¾y+]+ q #4(YE0[;KXt<]`}vppZ`cd`^sdgm50wgLy4zy' l u >j 5'Rs"8!v@=8c2q?ݪ_I/E$t:jp.W9_8QdNwT{-1t[mVw$gZN뎣aw-|M9O^ Ù_EABo-Wd6&v'K 椩g;i܁{q=|iݤ9NZ췾>h4kWݩWoH0GnNo'4VNhrQdž\A7%MN a81u V)(ս988U-=ߖG4eɳ rnYm{}#7w柷Zk 8tqrO8d{?(lY/w gc*gj+~l}s endstream endobj 3048 0 obj<>stream xYn7@ / V.A`8>䠃 %秚]V%ckqމޥdQP3qo W3J0#@lFr!3K\ѻL r9Z.ZG+uD #Vbbv$;gtӿχQ0_9C34gzәYx5w?~~g2__|h=96 ׻}v7zq FFJ./ǰJ)nyGkp;0S(^[g/zá)ESJeA 7ScvQ WC:c}M2Sns![%P Tϖd+ ʐtVAiPCT#KyGJ { cvWCcZyv1ͷdΙuvPg>YXr/~G.4)2[uL_na95,k.cBr.ᶘ]ѬK ͍e]vXI 7@'x.2P4 qy1dsk8KcqY8WA=Zj@rp D O\OjxVdNځKDiGjS'Pᙈ1u"8ӳd%| t 4f|caLD~ xik_҉4ETl&,D yGLs:S0aw DyG D43cXs;@A}P4-=XW<Ή6pсȬ+2bD>stream xn$'_  V\h[C>eWu lscyCO. 航],z],r )TػB4$pt-9ɵd|џ؅@MJ"AR* SAZ*@,8*,m&7TFzhICi}͑or; z"ʵPj$|5;Qe4 VzLEVF5Q5rh27, y ~$iRƯX 4~ YGA hDҗR*6*8`Jj6K!5)5Q\ (n0X]"RxbB7BzڨAm,mfH$Pt U1-YcopK Ҫ/rYV_( ЍY}6Y}6q4;U8泣c)bd%t aYi h):fZP m$QdIU\!Jh*vmtϻww_>/x/zZw~yET׻}vᷠG>}vCϓQ]@_W{h:aF*Ypx8<%h05H0ySd0m?$,Fކ11la0 a!Udfo  q? F$>n(4GÃlZ`aAKe^^+n+#|/AGHa480^a1f&9P y\Cd k "\"C.F؈&"{b>MBf2$_@i4H]L겑6?IJ叿-BŔ.k/+l<,<9du.fu[$!^InjAbj׵ڒt VQ:[3IW]z+2I7ͪuu#7Q{m}6]MSV'Vf$NI t5Zhy9~7$SN̠r5Ze>~sf0mg0fTy~3I=L 6 I1IfIt1mo+4{$8$)yvXo‰=$)85=N5ݢ=$ę3'cWbSy"_@2E9@d@[a  h{ (m "c<,}~1'<̅4a+tB%+yF_ CsCb:&t'3El(̼}H>iQbڬ,t'^ f6.4(Land &cOHu;w.2yi*Y"}TqĥXOũgY$g%3 K,u 9O%7n-)rw.f@GO6LYc,ioZhh&jDD\S/#yM${oݪk\"]J?+~=~l]=NӢ^|z]{Ft7?~uڱ\x"_VsuY*٥$١ $Ɲ_BAai۩9 S[f3X^V t}^z W<ɦ2;;͋=EEgȎ[GEoWWĩ:ǻKmuC%KF7}w8 endstream endobj 3250 0 obj<>stream xɪ7_E/pm\:#Lfs30%"Fp!MfzOYd]~[7F"U?]6,:9Ѳ\rv/% uw]<I.EAXh F;>oʔ7~ o:9o:ُU܄!hA'_̉xE1) qyͣE,ǹSvjeΙZyqEo&hBXOMr8;K?ڸ0䪀3vz*gAACLMr(WjCZx{^Qu'gʜYQXV؄K ;JLX&w;ΝrGU~*~A{0e ƺiߤ{ɝ+/#Ƚ"EX8@`9ЪPAI*~:8y9a5e=Ċa+Ԫ:DI >6- bmf.v;7l$^R ״;z5?uZe-i CkptļArOyԫe5l[X#GEE(*Bx% jt\/jol澜W6so!6uMUl(+i;߀< t?3JJJURJq]&>+i{~)EIr޽iR1={!Jy0|B*+RY[sѻDR3gRN.ODs`oaZ#yUw{h cSs ۦ'ݘ䤲jm~{KN#{Wܫ$օv2o!ur &I}n>L*Rܫ~N ch*-$EFiKRiNҘD JAܓJmz{-1)ө(RNn &uTդ=2|ma ]vP^ l AjP~Y0vk'i_ӤF첗E)lcX[̼8 UUu3NHT#(eC[{AAPYX?<.>eۿqsmq먼$K M?7 endstream endobj 3351 0 obj<>stream xYˮ]5 㼤m T3*!* Y~9ygďl'λbp (7!:Br\D<$'Ŭkw@.LUreĕ(A&eH5TQTRu e} k$̐j󱨍 ) 9gQrfبIc)ޱ']WRscj>4DO8@$nɎch 856rF`6*lRSQUp[W&\!aN $@IQgEĐ&FQD UJ*aqM iNXYb Rln'8 ܂ 5͔di`#/!HH6juL.zE]iAJ"9BRބf0 b/6&CO̩=o۷QS{]Ҟ%B(P\BT!EP}+ ) R>En*q$i0*gQ R2ƽy뗗?>)z}D}>CbL_25ӧ>ߗ觏>O2m|Zķo/O?|ӻhV3J\]֢4x̵uNdѹvE5&f_7Yl<݄ CZc4EQdljy{+KlC6q ɭ#瘢)e4"t-Ƭ[7.GzdKYB =tLYأkdP誯 tUC]eu$_NtKu[Γ=[.95BWMVBA)ܣk.Fߠ,,ǁ48#ݙ|NM/0)eP9W;0A{%s9MfEqhF*}hC[8xK[!G:4 LE;#r;a,l!rlj*iR|///1uyZ"1$WƧc8G0ْvMron`:Z 30ޠI; z,t٠yҏs  zB*N='.̆֏IƵoⲩ:{tѣ! b>=eOm?R]+O.FL0%Dc0gĺpe᪰Wî&kPrxGx0_=r&`kmkKwyek\Ej1ױt-inXhq5:y)TQxUCr(Z0$fQ2ta Np OjNw@z-ge\D{L7nyhGz]j^уp 0^>stream xYn'}^2 ?ek4wU/rHQ#ng߲. gfXC>I hci$RFEЈ0˧H31M,2<lro)I&ɐ[FX Wt!HZV5`f1yCX%v26;:"I &̑ sdc1G2"ce6 syvƑ٣Ug6[q0/u"8^A~-ָ^ 9+˩~%֯x$ wHq}@FHVcVܗ0,qhKLԸqa.Y2Ò\[dM 1DhI\ 3_DMAHh5PA慫ȱs# p#G!rCĞ =⇋O%2%S*hI؃B$ZpLb{É$VsN$wD+}$~\"4|yFpLE `IV"m_L&Xs"ؙd1篯^?^}Hp#=~}(z':4$"Z䡡T~bpP(6EPƁ (2]IQl/݇I Yj#[:i{cKDVc"<4/ -͎HbjL>Na[z{nGG`2Eʅ=hM&6S4d)Y(*^Ѳf5 [ex'ttYu[ l{%vp¸9i3ӀHf+KJ:2-u$<(XTԤ˟SCf-/HV<&'}[{ckjlpgbN.W;՛8KBJ]1uMgIϪmt6MO endstream endobj 3553 0 obj<>stream xX][G +ChH)ܤ[lM(K %[Пߣ;H:#I3v!xc !!< ߒx* Tg"91LI4NLF|P!Ŏ.AJ*x"b_9C.jic D$@^d(.Cʊ#G*>J9!<Ihl  i0`K=;RY {GDg )^}|$>RIG.W}`XEU#*A4EU^i Hx+X4&5{re]9RYwQQ6SB WA"7uI}$A\એ1MClх!KgN%p0,d eDbI@RRqp>8AJJ6sY'zsto f&9TB E>-CрE> @RY͐1Z}^_t}mo~֑V?vo>Xn͇ݯw=M?}oo+`fLJߧ_>@hA}lyJ:4h! _H zs ZMc\< ;E964/ӷ&cP@밇!sdh59>r}R y)gyk mZ6!LY荾.Qnrg9✛u4Ԡ4wѠꑭr0T%6 JZs@X.{Քsgn>7tWꢍf==4*{]m ݟ NCy`dV$6l5IsQʜ@9~qV<79ӬҋQdesg]ױ4O*sv2.Dz{&9| ~nR HTᬜN:I:@ pD Jw~i>+ޤ.A%Rg-X6X*"*#oMlV.zxiĶҙ:trK2 ԡC[VXOs@mte[g Xʹrr0)`*S2mSL3n+72U.-Qw1D6Qq{w_~{x%}g^߿aŧW?x9,1>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3623 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3624 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CCsT`@.X endstream endobj 3625 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CCsT`@.X endstream endobj 3626 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KCsT`@.R endstream endobj 3627 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsKT`@.R endstream endobj 3628 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsCT`@.X) endstream endobj 3629 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3630 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CC3T`@.X  endstream endobj 3631 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3632 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CC3T`@.X  endstream endobj 3633 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3634 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3635 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CC3T`@.X  endstream endobj 3636 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3637 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3638 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3639 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CC3T`@.X  endstream endobj 3640 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3641 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3642 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3643 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CC3T`@.X  endstream endobj 3644 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3645 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3646 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3647 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3648 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3649 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KC3T`@.R endstream endobj 3650 0 obj<>/Group<>>>stream x+2T0T0Pr3U"#3sT`@.R endstream endobj 3651 0 obj<>/Group<>>>stream x+2T0T0Pr3U"#3sT`@.R endstream endobj 3652 0 obj<>/Group<>>>stream x+2T0T0Pr3U"#SsT`@.R endstream endobj 3653 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KST`@.M^ endstream endobj 3654 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KST`@.M^ endstream endobj 3655 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KT`@.Mw] endstream endobj 3656 0 obj<>/Group<>>>stream x+2T0T0Pr3U"# #T`@.Xp endstream endobj 3657 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C#ST`@.] endstream endobj 3658 0 obj<>/Group<>>>stream x+2T0T0Pr3U"##T`@.X endstream endobj 3659 0 obj<>/Group<>>>stream x+2T0T0Pr3U"#KT`@.Xb endstream endobj 3660 0 obj<>/Group<>>>stream x+2T0T0Pr3U"S 3T`@.X endstream endobj 3661 0 obj<>/Group<>>>stream x+2T0T0Pr3U"S cT`@.X endstream endobj 3662 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3K3T`@.X endstream endobj 3663 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CCKT`@.XV endstream endobj 3664 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C#T`@.X endstream endobj 3665 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CKsT`@.R endstream endobj 3666 0 obj<>/Group<>>>stream x+2T0T0Pr3U"# T`@.R endstream endobj 3667 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cscT`@.X{ endstream endobj 3668 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ccsT`@.Xr endstream endobj 3669 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ccsT`@.Xr endstream endobj 3670 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ccsT`@.Xr endstream endobj 3671 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ccsT`@.Xr endstream endobj 3672 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3673 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3674 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3675 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3676 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3677 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3cT`@.R endstream endobj 3678 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsT`@.R endstream endobj 3679 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3680 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsT`@.R endstream endobj 3681 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CscT`@.R endstream endobj 3682 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3683 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cC3T`@.R endstream endobj 3684 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cC3T`@.R endstream endobj 3685 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CscT`@.R endstream endobj 3686 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsT`@.R endstream endobj 3687 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CscT`@.R endstream endobj 3688 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cCsT`@.R endstream endobj 3689 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3690 0 obj<>/Group<>>>stream x+2T0T0Pr3U"CsT`@.R endstream endobj 3691 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3cT`@.R endstream endobj 3692 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3cT`@.R endstream endobj 3693 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C3T`@.R endstream endobj 3694 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ST`@.MKY endstream endobj 3695 0 obj<>/Group<>>>stream x+2T0T0Pr3U"ST`@.MKY endstream endobj 3696 0 obj<>/Group<>>>stream x+2T0T0Pr3U",J MTZ endstream endobj 3697 0 obj<>/Group<>>>stream x+2T0T0Pr3U"K#cT`@.R endstream endobj 3698 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C##T`@.W endstream endobj 3699 0 obj<>/Group<>>>stream x+2T0T0Pr3U"K#cT`@.R endstream endobj 3700 0 obj<>/Group<>>>stream x+2T0T0Pr3U"SS3T`@.X endstream endobj 3701 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3702 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3703 0 obj<>/Group<>>>stream x+2T0T0Pr3U"C C#KT`@.dg) endstream endobj 3704 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3705 0 obj<>/Group<>>>stream x+2T0T0Pr3U"KcT`@.Xv endstream endobj 3706 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cCT`@.X endstream endobj 3707 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3708 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3709 0 obj<>/Group<>>>stream x+2T0T0Pr3U"cCT`@.X endstream endobj 3710 0 obj<>/Group<>>>stream x+2T0T0Pr3U"3CSST`@.Xw endstream endobj 3711 0 obj<>/Group<>>>stream x+2T0T0Pr3U"#csT`@.Xe endstream endobj 3744 0 obj<>stream xWG fO6-u1!\ d/{1T+\4ofnܾ'?w;̝ivm8am$'1LÛ Z(ikzۃem/hir˱,j{7(8^xmLplt؆sf ݎ*4<#hĬЈ܌&ϢT[iƮY%$˪9R#q@:.;mXUyWDh@ĝۘ^@Tuhx2+GbF[ 4,A=4? G5(;4C١qp8Q8\: ُ4uH"؜,NRc4b4L\>i45hl,j0U򇵨1X4єƈ "&FN5 />\ٛwNNNCtqJƺ%.EN,d`O(47+{4}3?ӡ'Cc-@Ί޼>~/?<zק/UoX˷o?$&S"x-Z>Kkl"G?w;D/n&nA8UZ Х5 Gx)}/#fkxf~iKrQޗ<5 >d}hهfeh m BD{μK{ʼXRfڴ!]w.cˊwoj>b&si>KS)ouU#E'MD/M4D7Md7 ?~  endstream endobj 3845 0 obj<>stream xW\G 'R[-b ͎}1_|I1~W{FJU%43vؑ-6_wj`fXx=1X՛7'ܖZ)鮉qMkb&fhb&&41 MLM̔\.Ks䥙,vi[4\4\KC_zj詡o }k襡n]='_=W^M>stream xKk[1ȪB4i$E65IXJh6ٴ%='9sdrm7۾۞x{dkt%;ж\ ў+PpT3F+hNFZ /QfaKF]И&YAcFr #+hD[Xƚ 4XV8;Z@;Tzj5~#٩zjJ s,;P Yjlh8 zHt T*hLYYAcb=*hrDvu<@) L\sZ[h:+XU+0Zj#yrO ӡ[>~'m ?* '$S!/L#VS͜^NT+';qLwķw/I3;ם   endstream endobj 4047 0 obj<>stream xWMkA+CNLA6DJo]ٷϫRW_;[-K[،@L̴b^gf#3X2^Kt)mfFKX#3^f3˔̌2{Lq+2g ̜˜#kET3hs +-$^-5R5%=eS7Аa5F215WL 5VPceTkv~xו+ZQIMѾ.YfXEMB@\-*E]kDj4P̡FCC22cFNPcƠ g"؃ȋd-|EAKDQO,5[bjb (5Q+%!"h8E!8ua0>65Pc FVI\fDY$-q(39pU&{ǥ%{!KaShƦiq||/~<\r vՋׯB z1ɀ 1`g4xb<1 OL77;3w;3w;cز3v;# 2eclwwS)ޔ9 2gaS0lʜM)r^)/R(/R(/R(/z/ڨz/(s(o(k(@iw'87tGEx)1Oi'x崜5AcYU 4~{̩[e#8Նj)8!ŝ{>stream xX=kA +^I%b ūI C0q& &g+f{2}ݺIRKnj_)W4 Ê,+1%f+ <i0F-]#G-C}X#G+epU'ApxRR& 5"H ֊QsZ1ǂ5!=U +e,}Cc$9D3 9V 9V I9Α=- z(rP|JE(ܣaZ"+)kW 9: 9r r"a4KWxȱ0+M9G[9#XmSjMQ:C E!`awZ3 4,T*[šEkS8A (#՘Vl`"E"y !zD-NPNrԢy8e%nȊx KfxD! $ ?s!GNFEAQ{ط7_oNw>x靼/WOwwUx?T%;F{5Cb.Np?7Vd^`*#T@zaKwiIUىF|jmeg"U.>Iߨ͝~}jOM4}wX8E~rWz9ܓF;*&z OJSIBvnp3}*BɏePRl:8ɆI[fTn]7u]7$;6pSn7qSn7%Ke Cc endstream endobj 4249 0 obj<>stream xWj@SB! J5qC@^=x. [Sկyl^K-ͻe~FZxK(;KDW]Z@a{''uFa1|2-F#ϲj._e+9`}Zٛ:PHd!jkI@<h%o`Vseȫ"yPѝ<,1i/xAid`nl(/ ^QhJM%Z-ÕR2X;Zq@5,ІΡթѷBRt*Kl\wkfSǕT^;xIڱv I85k"jXէ9أd5PǠP>stream xWMTI+'a*Xɂo<范axqYoDz8Lw6^j)(S ~4#Y54-yY|,H@ : n/pM/pKxa <`̓ `x V](d'CumQi5X' #R3+LV q#ZƳ YE95my771'8*Jj33Sf2,sf։f5mq Vg6n$< }*cA˓G1Z8wZX uhmGJ }0p #>*>3y .\ +f $T,V(V)9aJqr@7 UR,puhL(z]QlѨ@(d((@/P9z<1@9~]$JRԤ~EYn\!]h(ץ ~w}k~n~~.Yu)ݾ.xRA%9 endstream endobj 4451 0 obj<>stream xWMkA+'Bg0D^E%ߪպWakk6zVj=^w`[ K:K;ɣ$+I$/HDnr6y%&ϒcWFr2ie8j%;;Pl:$BdkՉ&P h%4߉Nڙɛsy1vrH0m#H ӨlU޽Wnoo?D?DSԟ4}>ߋ~Ki 〖h!V]+:tV/<~hѥRj|hph|S[U/>5zjѥtmh#ĶZ[Ckkhm Um;VUfhZe4G_y_j-Ro ]/W{BK텖 -kڵMڦvmz;{F7QIt}jKzږ{j٩f6?L= endstream endobj 4552 0 obj<>stream xUj@ Sd7QSm"H^TD~gR;׼$3Zocl6j7<&|;-+Y,țM#q/(9WImu2ikuȼAm2ɼF;5&֮梥{qͪkV]-E[KhVCUm/⾏>ؿ~//Mѯοkq~1 1 1 1 1_u1_u1_u1_u1_F"$y endstream endobj 4653 0 obj<>stream xWˊA“ V# e/_߈퉬xdNo9J-,c`b6Z"֭N;Z e`eFbx3.a%ae͢5IY'OYjj gT[Q-=R2TW+ VGdh3 ȱ1c# AgnpA ɱ;91V{ rlo QQiT+1KRQҺʳcbtʳf8pxe'; $Bt8 tb+]p잧cs V5Fq Q&T:&n5GG16pE̬gw>@̥Q#2fs+` (vvʽ7-ch Ѹ1^ 3] b$Q5k\)D?_~=}˫~zZ'FY!]O?D|Mě^8]qlъUOԬNԬNͪkKZ2%Z2%Z2Y jhVCեY]եY]եYݚխYݚխYݚUW%Kn5ѯ~Mk_~~'^O_^@̈>X2?| >/ 7S?^!+R\$-IEQr4eGS&4G\*CJh)A)RPr<;!Q4Ec MEo/y endstream endobj 4754 0 obj<>stream xVMoTW +W@k~ Ă7Dd BeæT{i祥EWx}lNf;^ұxxF-3 ):[ZL++6FpОQzM,K_YeXxf-3L0ӊъ%>GY#,Rk&Bѵ'Ux.""ٜkMj7Xp{ (ҲCG]2GʨdX+"8fH n/p,pYhbKM3X+} 2uX((jNXhmaE.1gDU8EKƂc⣦X.XXW rMPՑ5zCf5LX95[eknh+pwjwnlGGXu?Y,kX3aלF՜F8*VObsڕ_깹`ĹoFI~P xtx+J̅(t<ܣGprwcJ#n~{$8 8w^?7_7>Ae.P6r?I-o endstream endobj 4855 0 obj<>stream xXMT[ +W œ|2=ktQnܨ?ߪŃ[I%:[O9F3ϕIÒFÓOQRE2} G`FjИMF+ȩװ4Č3FKӊc$ƄƄY18u3DB捾$+9pVcZZ2&-pBG1 -p3NJA"ނŊVQ-oh ,4U`F;xOVŊ^kQW*q/y/l ]]'SB`<}-.wX8'2RxwR-Ԁ쥱 [}QB \ _pP p8p,]`+^`>ˑ*Q%Z*+dxQJ6E-zѣJu\G` ӧNj>?_~~γ?xɣg϶MƲ7C~*e<v(Nz=rFjahl$ʹ{uwWX̴ym-MZ?%u OM{uUڕcK$=7xLq\Sr̙?wQ^YW^L\]힟A|i㾺}"߯ws8W}?WMv8W 퇨`{&$Mg@ne#; N!`پN&KPxi X/ >UТwMz#FWNŽaQ~7/^ \zMN9,(s6 endstream endobj 4956 0 obj<>stream xXKKA+'==/"^V7O7A/^ !?U\Sp5Y{)f):?gϖE!d &ARhj*eYcG3Վgϩ99RO/7Hhk mtfJf]#Y~Γ4%0hP a[) /^GA#žШhYcsB-PFmY@΄ƨ3/ h̺,fKLs5"@?!B`B=Eˢ%/eYt 4лxfFuCh^Qr h4FcA -g1@h4f^ИSa@Ti GTI:eSFހuYY2LSF5 hT'@v4nF 4Na {48 4fZ@cV W:ɓ#eA] /0p\8u(W:Y1 eW1Q/qO!hX8437;:~uux۷_~>Ξ/>^\_ݲ ϏE- fEy|տZVoREkv]~p5}MDCфB1x}WГ84]k[εesm\[;V_kbM쯉5&_;v74,R+)я tթۅ+&nTDѿzՔOްH蛉wq[@5fvJ;ϦmRǢy.x%J:wm7?iO %] ݭW|2/jGk/ 6w70@_LQ5 endstream endobj 5057 0 obj<>stream xWMkTA+'!==_((nx%D[AO,5]U=:RN5יloiV+IL=$$-K:̃JZ*}zГi`$.c<]c4r-ˀX>##q@u.r@g-QXےģ#} 8,TR+TRgh9Gׂ2fcd i2e "W/YfHyG`+N5"OE=FfRSHSCUpT8Lܥ8tM{h$:j1+UpLw)|3%eZ*b$3V`bEG4bK4+JN%&XĿG^JqD J!91pL@PaOXLb|Z݌! G{"aJQEQGA` xx˷W_n?z8=x ã'=;m|Yapj*(}+٥P\ Ȩq<喜g$tvp4n_?.&WSnyS g|?D\6nﮏ/rsO?ɹ{ Byh>\=%fSFw޸eH|%ļ^-E]rJU {\-;+Z\u-,\u4b=%9pE/ rrr<~07"\{KSeC~0b77KsB={:[%\ؿ >stream xVmk0+Gz1+$[X(m^bRCb˿ߝv6twzlU  BC#(Q9 HAHQ "A:-BaIPa 1L#@sMɖ pQ`41r\2j,:T/FjIB܆FIPx`LtVOU06/-]]|:?ywr~~\J0>x~b3~wIwX ԎJC6inlf~) yV(c\[E+̃a\&3ʟ4)OωlLܤ|#e|g9.S>)hy^=wB1hXII\@ (¶" i:z̑ӐHHfͮez%֛5֑F %ầy={ŹƗku=n2MݩBF?%ƺBe<rdHc.qu0Wά*xQRe\T2 2_[Cm˷*wU-*BYݶfI^8?L6<#eH%Zy'j;!$'[F-b]nh}5st 0VP;*qe+urI۫=߲X~~"d6~{~͛.':plPrko88ۻep܎ Oux endstream endobj 5184 0 obj<>stream x]M9r c78-j#uk|0װÿdYU/E7`0?}<ï?})8^xNàM=OǗ:[ 등.L? 0 9%xC"k٪ +>6uiF~еbc]`q\uθJ4r'kBT(5*hQъ$.#`S{Si >ȉ[\q0` duZ4>pn 7aHXOnG;a`?mڣIxw:dzoa XGוpec]bR)G h%hO^r|?u8tDiTqii;ir݄*N.j(U$"7aHgD% rD4:y(,}FQXI4TQ#Z14;y+BwZJ&t")1;0䉨8LD90 Q"Z2 Dٛ╃Dsx֦pGd>c3'lMYa")Q1&Ҝ%&]'+Khi׳,L#+K`e+)\͢1ee LLΆ&` Gtn0%"8h_ Q"uTIJ:^oPOT. 9-rţ H) kOGq\:aӠU*5- ?Y_9WE留C"BP/Hs1l_fpڄ'.:1pb,Y^cir]19#aD,fQ/cIj]oguCbOH2D^B@^D(@u[=|o f}}0dy=Rzn!䎐N>y#>AR3OxBhN&^,0~I4bY k;`Lp;=ϖ[<&'};('AӏdM[} +E6ҿ]_oHzOazj&J&-Os[*l "7-t;Ay$9.bd'QXװ Y7v5J@jpnY*JUXI(Bٝ:]D+1 Ns0WM X9R LYW/o~/~YRA,zpl*KzQe >]M0SV[izFq]`ꀬ0=sfKGtDJ0H='Bk=6`qEЦ28BHd7C6?J9oƎn(& ZeC I[ͤު  Ў=7\]`$_ZٮVOB_tۣ~ VdN-Cg]=߀o\Xs5#\c ,ɀ=8_Cz:p{sU(ꫜ%B<%c_ HQ8|򋩂[ϯ7I[g)0!l7oejpsUMqH0#[ayFvD+tAd00^_&sa(,"{FxJkx3MfCIݵ$NGE"۽9\MOʭg+FxKYp=3/>9C(E^vl_KԜ@虆D7_+ ZXu@.tF"ZYz3pt%uQY z(KY"S#HՅ= z۱ZЋ\fnNF3mdU%^`:MVQ$Tܐ,1O]n_,b$^W3\9a:W9[barl8Q+y0^\p"^@.A ֋TyW.Xa-P oU6ҡGڶ.MBݢvRicoWL!u1l Ç)i0\rCY]eӭ}+(Z7 6 wmc(\B-rXvi*gӢXCU6[ WpP/=2~7=_ַ̪%30#Φ ;Kg /\w  E*`b=lys@ SmP{Ga*JKtT{ }z\aB(?eOt[ u2.<|"%ي3z#fmzy^-QמBGߝq#7Qg#PVv ]{6~K5JA6FhIsmw$\ D &Ԇ9G_k @IιȢX/A;] Z.>ZO}u\u/Ӝ}pe&xFS4ζȖ(r X zYIW5ZpW*ښQ$L[*MuPzp8\Z֠3*7*9-~F^pP `ЂSFRxWR7OU)Ybw9iUs%zRcQJ@)Y²Xku<,6Ӡ+TCe-w{=*FCmK& 8wCΰ4䕔VFh%_/%N ͱ^# Iq.U(vk(3s#-yx+J}.;5;26=.5@>y.Ӡ㝐fg \Tt H%h۪0۷_ot.0XkVH7|G=LɶzyΔ'DFs5is^_혯߈:0Mo@IWP_dsD}^ Ҝ,䨰#+ eEswsq" H\IWz>z{u3k&):]BϡLϢӯybpƛ7Z?wj uUSf2濼{wږq(3GxTK#ȿڔhF[^+u*OBHaqi#ߨ%P*Ktg)/fT!5IƍXĠ7j-a I]ktuQ]*8#K-H(n:hE5Kχ7|wfkV5 G4qRL]_åC7>hv e`~ =sVxV?}Bϒ{ٕ|ť\&RR h#N yV. ~ߘ,ט|E ud{/boV8,ۚ0`~ͷ(:reXm cbW6 gd=1h+% >KzN02c jjKKCz@K>,8<!r9Rh݀NsES055Ey> *F1feyƒ.tpnMǯOY@f 77x("|pB´|С(% ƒ>KA/}0*,0*;QMKIݒ [/ MAD\cব-<%\ٓ <#췚Lh3`#O5t S!'^Z3[PO >>TXCިu  Oh{&4I{^0te\Vzh'gU =r{z7Lzsxd;2f|獭)DsG ]j~Z؝z6;vgޱqOu{Wخ.GkO#;tN m;Vl͜g C??NC0PKdc-tD82LeػVcjOa+'oNO}}F7[|QR]}A\7О_͇i\Q\Ww"5q QA@~Z1K`J)F] r /lR=jer-mjRӵZI2e.aLF9[R2 T,l`qTl[^ɦufs-Jg| [&<5G`K0SntUH5;#td.o|{ )SrQQH3n#B T{hPqh-Km.&ַl#q.=9iA6 q̮#(a 9x oqِNC?C@iRq7?|6mq n h5E Oj1r'lZ>K6,akzeA(er2翻RvnB%(|Po~6^yǟrK\-T:ڌ^te?UX~'՛]L!0YjhA<%7]@^u.EϢlJ[뙥Dno\r}؅%vM+(:Aq=ұ˱T[vl " 7\ ך,]O!5I*'C庴 [Osö VKܙYnѸa@+:KR\cQABv 5HĹ endstream endobj 1 0 obj<>/Contents[12 0 R]/MediaBox[0 0 1190 842]>> endobj 2 0 obj<>stream xSj0}tMNfXf/Ic!ܓ6  @ Ѓc "s%.hn|G)ɮU%')|L4>ۅVh26j*7Ȭ2{Y &JO`M0I\${? #NH7UlhC)PֻVȅ?˼ru9(kRmj{-k39P2 ee幖P#UFleW{T2\4ljn-F.n-Uu8EgzӲ9NDP>tWhP窴NcnN:nV ?{ug%A+ m'fr endstream endobj 4 0 obj<>stream xK7C - +0d'Ynt{A2Tswx>Q?|Ϗڄ>jZGTcs|){_{*Çp||6o|1;'ZRZK/ؒn=n* q-E%Y)q%]==bOJ~VsH6ਔ& Fxe M򥵣uZ.f#Yo{klC(KNԊkԥkz"Qd֛1郋+6{BƮdO7*[J]~߁l-%D'41_/B 7!u:MTdcqܓ֢k=#Bjw%7WS`yK(a/PZhc )|S{5tCaky+Mgu#6=19 BPdx|K=rpmF~! #OI) 75DRZIi&JMb_k=|-^$v/-d'"D%0 ɬʗ|{'6|펈L,a.X)|ǾԬknN$1JK Q%1]ɬؓ/ 6?l=Oؔ%QDX#OI) X.X)|ǾԬas7lڤە6E.D&Ũw*&FcO+zz[6\ĀBDX#OI) 7%T;9R*9Jȕkρֲ>)|9K,r=!y:cjip'7N?E`jq05> y KVCnҽMT?WpԵ-J 5ZAsv@#^$l3bݘ= ULfWHa[ce\oiVyHy(ĩ?TNl."qiQPZ--.ǾAث$֒A!& eЬ DmSjE64mz@b$2wsZ0V ooXsZ AMʲNh63 Yq2$FN*ٚx<ǰ'g8r35k Niְ>m"wֆcm+k䀪nm&$Ě1+UDf(aۤ'Y7Ų!$FS@Jl=ȣZU b+f "{b Ǭ֫M_8^D-_E&K Q2OW #OI) 7% 9jW;aiܼF8!Ml$m f2 [cڬW$N/JXAK#db #OI) wX MU'hzk}c X{,abULԻz}׋<ꐽ 1Tr;lj#<)^D)!ZŗP> m*89h4|+'Ӭa[$x%9֡D WE"T!ƴe dx|Vf1yՋ?3yH y=EUF'h+&f  91pIQ]%  \/=6O8A^Џ)8q ݉UO$V=O$f  (rrN@&1LO//q za' q<'N)ŷR/Z3 36V-|S{,m DD.Hy@䀪{%FƐyO|Ѱ@ \F0 G^N;M9$V Ik nMjĆ-< #GD&Ru2/ڣuG'C"b>:FX]I$V|}ҞB#3)e1TYێﻡYmӚ۾FDuTeq{:[Sb:mB ڔԬ)-=\tKQ:9fS c.:Xsep Jb;:EѷǾ9wW }_jV-jwxYI+1d}_ayTWۦ6huHKbt im3B84iU'hZ>JrZkKWEȴCN?EڞI5h_P%"b>:Qxm+QX _jV6wEZcTb`%12e*:f~hXa^$sRN=9V&U MK ;aHkf"HTZI!U'lb_a>z 󐨧+z[$ORsh;"1T1Q;^"R\/b+SRu ?= W$>AKl61mG$DX&:(a1\/fe/H<%UbXA}Yv抴 ~j"jKbd :gW/}Ѱ@X¶.D}Tu }?cz>A 6j_1q>0l˲e-幰ߝ[j,} kk3[aU[CQ'85K$|8pGlPwgi\2l;~∂ o/6o9GH$M`מa1CHEZ,, $CÔbɻdYEυj.gh[>A۪O%tZs:--j$Ŷu]tEo!C\/tT&)4qn{Oh)}%}e/k+ He6ν>b?W: }[<`|{ h LW>%l#Bj/(~[{l- Iþo={ s6h=j[KIEH6fdXx[pQWƫ'%^ړ sVᛴ J@M.]@iIĸͬBڝqKǦbJXZLPG\BiI8Gr mM bJXZAq8WPZ|71-+JX\B,\K J(K(->ⰷGca4 b?ST֦^Yx-`uO ؓ *GU =k]Pp%fm&4WbOf{ ʮ,{wqߦpL"XbJ}? &=BFn+=) lɥŗPfEI+A,b&GZ V4"mPIv^nk sNҞ-f<5ʝSHۘp%osS6BgfdiXx FxH)tQr~_ϕ[-αD`"S%&sr31Sȴ^x }涇|M~ VItfqHp]6va^X6=J>N8eO$\܄Vbطy8۱Fx^IB~Z-j~v0l6s֘Dq V~xľ $ͥ5NBՄ섶-Vm!'-Q`n }h P>'ئ V,H#je"c8]`M襍汈`2lލ脦. =JR P!4 On vxfH+d"b泦顊c JdQ7)Iӄ6pIvS_ 0H-<= [@xA ےn21DXiy,b5[EIghd'τk=gBUIң N<+ ^2I#T+aCU*{TOKU}{23*6'dvLָO=͉cf a20M>` aFmɩB&.h>iBeW#ȢݩoI~BjE3#)BN-7x37 -~WB=bV)T+aCU6"_~$mMOmR8&&I0uBp;GvP<')H G)T+[z-TьI+U[BlF39 hZBLVvB^ s ќ|.%DȖv=1-Azd?H9Zmք^h D`RW9</a7u!!tnwp$ \+7FO `<_\| E?8QuF ç0p[/(~c(-r.nGPk.v'wZ%N q-"¸{-n}xoͰ^q3'gş+cqu$mqO~vqKş+Z 4kRyP^[19/SB좎Yy``ΚͲυ{mf?n 5˓=%_ܰ /!8|&"K}#_Yx WMT^8J0e/(~oG{P76;%VNl@,q]1Q>c gq]Ȱ4g ϕ{- e^÷!L]1.[C,\b8LNka޿w ™a37}63̒)o:ۣK(fq r v!q]p.,\hإ'Bzq.3GnXyŰm{m+? Np`OVOmʮ({:m`;ҙ۬,\h\{w56?K)!|_Q%on8ӋA[Xy{bq1K'1f"e8| k(c|y}Ko>߻ O[n)߂s7[|`)8¥Oa[X ş+Z|2qp7ο8yA bx䆽j?W:UH J,V%.!FreEpVjfe86f,&(p%tkqn;qe (p=VqyofzAe|*V`զb:t{x2 9hkHş+cqƎiC81ٸ%ϕ,捐 Ef[OY n7% v+aauBMW> ݚf|Dur.jY܃{MQ#GZ <1~Ee7mi pxMzڶRXb'b|dRei\$ \B?+ٟ6, lXD=ke"c>*Xkp ~3ݗn pN٬,B^ &)w-h p'p[1kV&8}Oc{/p͒' (gg'>3M|4.VrV3ěYe~o/t9m1Ai\jbWPZ|yŴO6 pߗ6%ϕ{-mۘ %=e%ﳸSѬ aq^ʱWRLV%Zm`YtAi^A9Hti1C1%Ys#4TÏEKş+Zw76ɻX%|JK3TR%ST vΛi%§~ u.}~+S«y4۱Xyť7#\ ;1LxO ٥1/(~Zš9q zqD7f%7[v8 <8:\BŗPVVm5VQ:YQ8~s.^C)aǎ.}[Eau?Lic.S GyoMmΑ`L{PV:A[X%ϕƻ&;Ɓ§>TzD7WdQS(QQ4m6b'62bS bJ &~c[!-}f)6ٶ1f#'ziW?X #—% آLJ>0u>q[w9?16SRd*y鈆m o6çU.zɚ o{|6S YLJ2ZmJb&G:mJnr NPP]#?V9BT*t#HS 6m<Kz::L^- Ih#c` Yw̽-y)"c{( X# %Y ]dUD,==ʨ >jɬ^E)wxO#"S*>d 9%W~(]qSط|lS!N*"\f&Qc Rٌ^jM G7QشikՐRa6%Is2?N&ۓS!6sZK6 )sJ!25&:sz"@dM6"א2rfu*K݉[`ږ'bbNLE[_o+/Xdʰ~_1iw}fzPO=#—K8ܸceN@z09O2!F&ka<Ӓap8 ad`1U{w'hr\6fX3 lJ,llb2PI 125YAR:XrOVE/FU~"—O&?km$[[Ub@d->'*!e匡u*ȟ%VN' 9ZK9%;9} 1TYMjL+8'\/NL<1a/X =eUDАcfkLZԼ_BDxS;E!F*ku_C9CTj COYSk&[8fZ|ppRS!F*kB,~1T/̓%/X =eUDnO-B֏>΢14¯5|>YU[OZXqd)EME'|~鈵lYr8Zg6SɹM+A+|VV8D]5@iFɴ}|GdY+ mSiEX dMDnOk Tm LE!!/5F"^ًIk:%E"kab2V&J.40ߟV#hFh_j^C|(bPSa!E&kIz~cOW(aXEIZ.!1Nu*sDRd i&X j)cdL,b'k"g&i&W8Pmb_j^CJǜtppn;g0B DM'I j)cdJ,Rbm| YЍߘuN=Rp~.4޺(G;M /?a\]K)aCG;] SB0.C9Yvgg }öQ7[Vi-vSV:m^ {b}mǯK{Gzi{ m\zXtN"\| E$'f"#nNMH)bn(lh+>O!Ä>\B*\bx7$1m05x7)!<Ҹ灋/(~k;ۃwheXŴvR&;/(~űFO桖}wd1\dXxoVTG7n$gfaDϕ{Nt?p#`խ=/}*y;ԅ ٴ;B°?/@}W~ 5ϕ?4ù¸{? (8Q5:?!@SyHo{X4ϕ[[E{&9J"۞]x[knY§k(Q%omVg8 ίD%7c˴~-19 >s4+& f./D;` b\| b1m|53q^?X,?$u1yNN Ns86Pe0$Xq fV ?Wo E9;qi/Aa O^]0iIeAަ>7~@E88d sVaWkye! n@L^eWL= |a 5npSȭ[2,\حZHLV i'Z4껵2|+/6b(0*9uF'<nϴ(n15ϕ{;=Rn#fa Vk bxqK(A#|f\up4١h.,\hwpc8O!]Apr gl¢r?h ~I7 Iav%576 6%8&6-uv-!tjq{{v_YLPJO:om[8lr M ŗPb,}&[O qK.5#T1nKNFŗPw)#T1nŽ&%oqydzj~̓'>Als:6GP^,HՐ.m>(bҸmlpJO:bfçb]h;[C,\V,&([-.`i|T1NAL"aZv 8K?o37z?91=/5{^Op Om~X`~ >/ҞViH:k]1p{ b2k)aeoCŗP紐 WA ᰺\Ⱥin^O͞RQvxH>?W:n|| @:S?|…K Z*T=N) /!s{._ .X ǞSB[v80(I{齖]\5I度m>0ϕ{L324(By%_BY3q*1qj dՓ[]pXdҰ :6 7Z}[ZR4Svz8awbJXkdbJ筭wlK{?}j6ח2TחZcZE[Buym&{׼w"v4B815ϕ?V-95YXy6wȻiK؟LVțFy132y3^?ipJ|uŽ'6=r57!!7gw.{Lk+s AaouVP|yžf^]pBPe[=%tڄ wb8%Ɲui1Earcc#/΃A \?W:bWmk}l9a?W:ow'>sbOC^ x ݵ1konlJK$n9~bսro$P'wZ\Æ.çrop:KE6nIxυ[\vQyI +çu/(~bC)DP^TOWP)tykpH A#5S>^BQNVz!xŗ/,&6b&[m^6ܓbޓ[[홋||n[>Գp%&*x#6WMT[;&b 76W.c5)acŗPy[ Ğ|)jSoIxU3?l"ktP_/E%e伥/(~܍ca it,a}-+FWRa|8Z#GX ȉ~NkTA #—%\t5'%*8uRd i&)3KҽUh݊|`)5s5tq&1y&M\MWxx0~XBaxO~->H=&uq=SU=/(~ߊ3mCNkqoxP=wyZ.A]ƎwgsaQN_ wt ! )綍lR ZkK3ci;ʕPphZaЍ-P.e"c8`M)*!=Hu=:om0#: Oh[ĥp)95aAgM™9&}MB:HIz%! =U!r8Ŗn;l>yS6M\ Q ˋqcE( hh&k$l0!zS ~&`ƽ9M'4m⵰l)0/#D*M?:κeoU<:Ḃ ,dsLy VBzmvGN-b$x+`۔7 x3ItʗPOMB:aINN6D`U)*!&G.fH̶8Iӎp%:?jNYc $ iUN+Y>(''NM]2G * }Tq^+U|jͲm1VxB ^ S#8HW"*Wdk)$f [ }`M)*!wP pإrJ{6&7A1O)a˅+L.}TsIz<39瑠<ґ/_1d<8q/C}cwg3L~m[0?T[ki/WP:9<$Z/<9obϟPŸ6?_K(VNI K1G[~6x57Мqp.~ ;a|q>:oުN~]24ߠ8:=jكY'Oh?.=bؽN^ B[\$K$;8u>ko|Ǫg_p #9JBI8`U)*!uO1|*ʀW)aV+B{@T%fl_BX!^?z!9db3ʆ)l~f)AS# _j/ =`uc[EC;K!d COYSHuxi RmUT훤j~Ď 6S5*OI?~t CHzp~-،h7r 1$ ;$Yx¹$;ppR ׏d%1 NX!TMϾv| \2~|-^A<Bcr8J3A!qh? 9/g7N\b<zf`ϏaɓzBN_1W`=Y%U* 8h"1=jv6p>|ﮅ'i)Ҏ phVioЅ\E/6K8*)ؽ8_ԱAs-rlmn &Yy˗wL${Xc%#I?J{fe UpxS]qAd޺#\:!µ*)}`U)"_swxMj&49/جdڜV9G,+q ?g?L…WlfiB䨓fֳcݯ c԰p8/aϢ ~,B,pC1 vy=(1 ڷX[KU -A+/qT/őyHy )F%U:?O MiЄ3+,%1F B4a_$։z$^᧊dTپY oiϕra#ahE!-_ Ϲ&з50QyBs`q)xsa 69/t6cUٴ8~" ~(Xm%qf6l.L2fcPTt8h sbH'c.*RGsJw!o 𪧖qR-H8 !$pZMb-?  8Q 99 q JLU/E8~V (ꕄ̓pxS9?rlQ;GOuɕ5jNbC$L ۦ*ca@^X '4 [{p'{Z}SPpa"H20^$} 1*Ŏ@/Fw[AvfHDh[9jHd ׹6/rS|S > qWJKC؛V=Sp$B^%M6.ZK0A{ mRK'lqn2`XJs}9/+CMA'u45'6ǟ)TmCN m_ #|6^4 y6"Bi5q{hČRm H :y w[iT2SBlvpNfE_꽂3 VIڦx7&ιb?|)F$M:ọlGTNV3KW'b2'U "w2|/|h``ϟ?;O6<~#*n Z8=Bȓ K}^Up1+v=3+!IsYLpxKTZlY͕kqN~إNJwzMG@%ze12TYm^:bO7bTҤ 詃Fh_j^C:u> u>B>H[lװ2S_9|Zyq!ǠrSh RX U=yr?^*c~VЄo=p_ `r?H֦Bi&\^%hٗSWp& urR^I< RTKe7pf~ N?#WZ#wwCݐ#EzD=rY#U`EX͉à&_r0=ՌKkQG'8~Rh'i#WfK8AƎE/Ƣw~fGvm_!<v_ aʲiw+؝`M)*!|By1oVxBk`2sZ4kF&+YMt N)+ 'U:ZlYn(8D?WZww`7CfoH#vX]ؤi`"r.cfa5>? ]gvRBi0[X±U/6j ҘSC-&HImV!O;0RQ\:f*kzІ(aV5pv#[ηlnkT'1*N>R>Rd->'h .[z+N"[NuXHu*a~#}&.bs 9{CgnVvB|){(PMαj m_ sdr1"r]19Wn잤QtYoza_7rn{Чy Mod'/Ϻ+6ˍR #MC׌ިRO݌_4nG;nlO\~'q퉐,B+B;,2jppbyW[GpJ3)n4w郅y`9koEFusj2y<沷JvDpnNAgpYxBLK ېe$c$y9T5-?rX_WpK. WEy/Xzz 鱊w/r3>&m_ #MRAA/6i{ #TW2OBOO!=Vqyc«`\C':sa$k1'W/a;1e8چCRGB CBf/z_P=#r BLv~?ѵ)G#ѢVKW0xJ7!)Tb#ܬJ^M!uU\oM'nQDD`*꟧i436sJ~yiS᛹-QjX[1JjqCNcmS3'@NU6?ޞp%L N Fo7V- |}<"HsH!5RRLX8UY Dzce& HHDuq~) w7pCO,[$)[ũ5'3mo\aΘ4xgO'u5s}J% $HMKc=Sו(nk%;} q>!14)sZB KaC6ax*j)`48O KWppCL?:GV&/cNR^8=@ ͐"ڦ!h"-;h_ *8~ocU+fn/ 5ZOY?~užo<5SjŇЮ-Ox~Ua^X9ZjR.Hk U "'U!+G4O-0 !&;UPB#h֌Fh_jcUHʑb$J)6ͪ ̓*[Wp ^Z9yrI^TeCWpX1 +8d.QVRenj]0#Ӧ&kaKa_Ops\ Tc|R;6,m#Ⱦ{cqpel-zoix5qNUø2^yY'mCr Rl5 Ҥ >y\T re$Ӳ*.mU~ԏTᢹjdٗzxV6ϳo}vj1ɧ4p&{Ê*&{1EM&?]>n Bdv\(A-Jc n2iOdaVJ3<.`n| )sVKeg2;o[e-6-$Uf/}Ѱղ!bHd<$kxb)"2ky Ԟ̱ >9 ܛ(cF~ \UޫVkbrkY1KU MI\/41^H1 TeCVg~d_3+, 2G+Lz6۪.p<c|2OޓWT/=R<%/ ,q Z{N= )p^Rx W?.8šWBRm>/!5KlxRKtH!ϬnS4BwB sweN? /o[R8NWǻ"BkgZ}r0n,f^(%ذԐ{: ~"޻/9PmV-&J8B%$N o,tw0nGak5Ntb:gO OZȿS UtC~q0dM,A |VxfXW,!6``m$'X@qw$(`KHUf/}u\o#m>yHy )6<B5ls;Ù!-r5_ Q}Pꆟ]9N,'⊨TM4<ql*1M[Y6/U?}E_wy"JMj"/m4Eod<=7 Fh_j^Bbz8xΩHtO1'=`)ԩȆ,|^391!Lv̊{hu+NRa75ڼðŹFrؒ ɴl8b"Sscun`MTZפVߞFh_j~j ,twLQsވI|W+R¦1:0dם`)֩ > Op5;aʲ lҞvѥZ{أMU8";ڗp'y!0Ssaa#g+;} aTlUc\SR훚C/,T%u(Lv;r@QD*nKKhpne%2 a C̗T~pf Y+8PbSմa}a/aĒ++`BCzܗ澴ۭ6/UrRWDM6>KP0!Bմͽp!by v/9*!?}*56å}EKx<.=Z@HNfE/uQ$q{>MA{h cԘJ͚j6M]oXsM @f!8/vN-:?~;˚} P?ɶG;lײb,_ O)u#Q+}G 'n U+qE}Ҿ;U2!Oc}FSRaӎE%_k?IH8LRſEB9!*IUf pBJңF?_SЁd2^2Ice_뽀^*z̩ BFf#\L ƉcQFs1[3 fWƟ$+zgd֟L9,>`Uvv(7]Lߨ&x?}i,M✄f 1s$ *D+<>pCh3و; i"`EY֬i}䰞p4,p2}? e"p8S@UC|[+`%lfB^cy˥B"9dVXLX8UY Ÿpx!(J) cz*cp#/5_w섔2 f'2pj&/I^mt?&;bЎ1;Ka9"S-p:9W~pBznN;̊^iMlaxvy-Wik6!ĆM-C; (|^ Y-4]tX 7_3p)Ҍa?p'i Qew~ 6p1!$Cg}v䰎H/`mvM'p@Mc_$~3ex!/Ij m_ #·gJJ7:x4MlN(+['T6*!?N||=uc˟&P #/5_  .PH?ހQqq!AzuqmFG6j&O0qHpDT*i1<۫Қ=͔r\J֢Y pm ^ixW߁7Qi2hi14vaeK+l׽ diT\ uߤ rimiwHn팓J]%pT >yp< g/X,{a}p(%ذ]~ O26od&ɭǰL_$#ݶ n?w!}?0Ka;AlETo$nH :[}uD n-]y>mg!TcF`Gu 3Ӗm"D# _S.ؘ4Og][<^' ӦkaS/ᘔP4q!=RGVMnRsPd>2`!<>ecJlӏ p:,IM@S~RN+X*gfN8zzu=+CLúJl辑 ݆z<b&HNPsA!<&a ,&9UiܢT,l@]ڵ0A#Z1Y^] /SD%~z$;Lİq"NU6ouq|E eK !asޘѰ0p&ƕiKŵH!o 2~3U bA4( ,)^/A}蔖ޔWmޅȾZ|O8Q_qBܱ,^&A{{"lo=_c25Kr{orWD-Lp pU$\ܟ%'\cENҪ̓{t(S)D. FҼpƛ~^^p GJ|_ qd\ؓ,*"p<{6ϋ Q4%eg#O!B!Jlߘ h";oB$J%ւ+"+p6Ym>ϑbۦځ$2y'їmGܱ^ 'Tb4‰m [W Ox\m ~! o] p+N?{x}zcg̰X{7Z l#p Bj:)4 um{1x/Rc66=Mt- |h6~|ߧlnJ5SI9I^a\Aɕs:G&F659aVRs|O@g@?Bյ(ńS0nWXwPn" $L,&;UP<0K?QĔJuFh_j# tTyu.HNfT%Ll%#T/̓)$/TP<9?r"4Y闅{0B+Rqo$s@Na S50d} GرZ 'H>H1 dF}IvQ\&;s6SNZOF+0Eq/~&۝CrNMH> 4*>ڀa44.D(*7p<5v3p*^oZᗚ`{i#rC%yO1*pirp#H0{k Tmlgic85\`1թKrF3wS_ԫ ך/ g iÉ@R1jp#QLX>D~ҺIu al耰e/~uVGBz4 +|= E1փ,*kaAXc_d98 /uj2QyvlG*%YV 6p@.@]9[i~ *ka3/dP4!|bԩD繃#bk 6oRQ;sзJ +N&:/qI%q4܈lqyV7D ˡaDP_Q<"7\~cԡDhrDžT8_Nhe_齄=VH?#ds:oCե74YLW䔠i*sL\?A3{8# |߆E#fc)p#jl&G 8T-!89$XLDuq~#zGLXq%h_]>7v퓦+z  uC5n pL Z>ubN1 dbD"?3VK#W8BEA#R!m}"-{j#dNUø"2aȩVJ 'G>HTRe-2 q=l-GZKMJ~y ݣyVP |ZJ5Gx-ɚ|W+ܨeԋsNLB&'0Y +88l' `''~G„1*p ܉ &P0d }9/+SDV'U$dCt4*<g/ B;0<|^'< _jWpLW0<OZ$iTem>/jf8UMU-7&S6+a'< | G[,}1O֪R8;EhDfdnK>}bVdFw>;je:pHyآV~#WaLm:ij[Lf#OiZ,͇^ba\ ^~ /X =eUHa~8RsRxkYF+8&ͭq:MLIf8`RL8UY㊘f8ZibJ+bTRe 1FByg!ݤ\5Axmb.ђ* MNU"ߴ} K3^yyb)o0Tm9EjoDf~i$%Ⱦ{5%n+ щ 1eUʴ<%M,+m}!9S)6cL/V=l>ԣvSKW0f >D׉s05~$Ǩ:Y8UY 7*Q&^~ /XLv~5k+9)$^OmjaV580A8xL5]*5]W6R{"61NH) dF+"9)m0#—%<{)}V4l5=iiPm>/*Y_ws ,*AMajuo^ laV+86A+eH10e$rq2|q?K2O.# )FlHab~ h新W3$h_jc+&{;"nr*-͇E9cH ̓QD`*꟧$:Aм.MA+Rq.+ 3D0=-FNU"{6K<6`1 ,q `/Գ3TbD'3Z ا@#{+Μ?8|5U6/,FՓJͳza4j)3t:(\N(*엓O*T5s=qZ׿Mgz`bĶIΨR2'rrvuTTHz8t ki.p1e2[E->۠^Zf$'0O\pjK汢cvOa}!#TD35ߊu&C>ʴ gU%J?h`{/Q~X+w)4X} 6•}FZ1OGNX)4Soʡ}h XuTaSװ QO@Sk&G9gvWI x,J~+c\jcEN )Vִ3F 5p zιpgr[LAbo12"g1Шm>_L1fg28bSJɇ) +}Hp[MÕaSw'FYN]R{+}X!5#b#+LQTZ 9S݅!fʪ8?绒tףV?| &7.yt8B1bBQuX|17ܻt\y.^ 1 ZC~ 1[ÜOUzXpNO1cm>c}3@F)AxXeČu]b1{_1pɠ}_. mJ6riDE2 }6W30^k ?|E*뾏b@s gczV{+WE5^<Յ!fʪ8?FulMwedct7ZEQŞx51+Z=f'sȧ :(m:؃I)7yV5 J5( r \j uA}AZWy`μ(TBV|,ٗ7Uj'~u/ ,ZCv 3Fi?6,K0s7ƾ-+*l}ގŌ2%@!u#j 9𻊾SDb8_9n|cHŻa;0L4%$PX2L9͢V'Zoa25qn >혵Bbj,=f+rЈo,lL2#e #+ҭQWAfaS=ӣNLiq7Oћv**⋘PKb7Hħa6{14j ݷRy4ealU[aSwpCIYJ=}G_u%Gl%byYUЈ⋘'pR1.zƺݯ3eUk?Ha%֜ RRlgkqۍbæPse^}xj ks$*l} |L 98?%`VSDb8ac4!u٧ui4%' {QCt: .'Ome>{⩲c2gGGs\7zb>ִ|~ؓR$̞pӈ5.v:=w [>l~ei?EL|Oo ۄ Xb1{`aLF71>VjzQ<ХpylخNYX*T53,cuTD"UH"6b`+Vdn<&'L !cZ(i+j \,*lzBf9T} r1$uEX{ hڻ %raHI0US'e %-(ve37P;4#7ĵq+1X`IbuB)Ql+!UUk]Om>)ʖ|`1O٧zoE:p Uy/jͺ{/83 3< iFN ej" T!5O#j#+LXIRS֑ F4 m]AY PKJhs[$L `X;IS=Mjb8?u56ٸm=v)\*a{=u}h3 ?| jFѮ}tTXQoZȪV[{Ht\o2H3eUkOaѡ1}2ufx~RR6D yCWj6Čj}Q/}Ya]% Pvj\)9[$q@mzNUXpuז ^)LW᧚/!D7o [k !GP!& U⋘} 뾥1n}>GcսbXVv')1UdpW᧚/ƽ{3 /=l Q IcU6/6[wWsCU`^N )bo%ԲKlaSwP,KNDdrKńg Yj"f_ˆc\KŚ'~u/U`Bz8tUbp >S%IX*Tq~c䦑ͤjh'JYjb-aa53jM0LXY菶ʰev_Jfx~vo$vSm9 Yj1bg-CL@tXuv*NLbW4=(M+@ Tz>799OW[FxBʳ(BVj gީ !5O#b#+mfRqBغnZUJh?RA|j-J%P>++p}JQc/GR8箍G+bjZM>WLcqTܩ VLc5-A~?wyK!lf:!Gw;1LPYW]%#(Td-O^2 9^vhir✽_oaiQl ANa~ w)SX5a. K'a'goaotx $or} fҕ&eXBMq8%l`LXY I9efdR̳,Ó;ƭQ#޳qLܑͦf15U#S=2H7eO0b#i=lq_:i儵75AF3AJ/c3,E>`5b^XSWGÕ _0Iѽ ̡SԔ QD,5V{K-а1MFv_U&bj<\:21f!kY37>.T%e+D O4BaiþW~Q3'&KYj12ң ;^q+qaҨvEk?yܧx*\2uM"$|<tI H&mU6/6UC]̨u6$FZM >L⥯ ۰,$D6߼ldbegpˏ`i12ƱcB-tc &eئ>#UEk\Ů%ţtL,w^Yz:8y0bؗUefvdo \մu6yӠ5P~jPY -,SgI,n #go;12A\[5+El=?ؖ"G-P22]kks0:,G#?Z{LHM;HQ{c߰$TlLa_U}r1._HaEv3POPnjRP|qwrshYK t+ U"߃s!(mW H? /}f~)˼4Q(oIrl̀2xcD1͆ώ#;&E褮,əqX,>*u*ȯčmp= e@Lžg 킯DFKlh erڣPcbj6?W0( X6tо3%jۀPA<.=`W|YJ(Qe.P YTyS.]Y.֯ŪQ:%jშ~<.b=\/9׳ya}/ &o;o[Q }XOqsWDm;0Ts({{3|||:O.9YyTx:<`ވ <ӱ0QÓ+9WK}hXGDP|5E5ap~6 8i6yt+0CiKa [3E%$i*˱2 E5:]2D< ==+oD 5eH{!V?lW@s ?Tijbni7>ž+#2D< ;z q~CDnop;x u0_ 3LXWډ&wWҿH*˱be2XP5o@bOO!= AWx \s..5O IuTD4ps^g2/v=Y3oݾ.թ)q-c"*Ưgu%<"ڞ;c0j[@tJVnf'~)0;j / 9τmdaώ#;щ]ǵD0TxWA~x{*Њ$T\@:gt_(-*LU ٿ#: p*`,- L iáBx,a'"M0  >cFS"pʹG}ɟ5OmI.Yo^N7GkugtoaϑGv"b]<+\FzlwI~je]^c 0z{&gG˺k뵎kZgaa7O< dGC>,tٷ<*\[eC!'~)Lg ߌP3ޚ hI&WΛKgȻTiQ@ͨ&H. E9U_!XKއȚ~s]cG5hhl- MK'(y/KDEg#aZY}S@(B>xrX팗٥)ؑY1'7>)a,| +)( G"JX\/9AP=}%$J q-Q,^ U)U_!_ kj啕Ӿ/ 0kB{+Uf&7QElٓcd}5Z^u؉qC8+k\ ׬H#WVZK֩+> 1VִH2uW +ʦ3 |l1 / 7&%öd$U.~Ulٗc8~}-_ǰ quq*ȯ$@[x]ga?dԣodI,Eaƪ"Ͼo0ѩ9a P .X=S< Bޟu)K-bY¬h#EᨤxGg5:-̼ѬB<0JmUx0C Ab4|@1,[P37~dv @ Ug#C@m{04hW!~t>Ph?Q}J Cu"W](1TTByf]0 xt[5'XL0>qn o ⋆@E2:D< ;z q2f͜ / ל?.p3k{~f( V~)̰Խ Ϗ+'{nH``{ N.^ ow y@\ND3;a4WQ~ ;>M8GEuK8 \3Txʼ=I87HwI(V_o$Lȩ;1oUECz\AqSJwXZˀ{nOΛT\W~)̰݆ˆ-D{ڨ< מyB[h1;2^y0lVǝXg `TxWA~RybcA;Jسa,| 7Trԍ[-KlgGOuMfX6e#>y\E򃬣9\fC_RfY* U9U_!'>foIxQ!Lٸ3_ 3>9 e$9q ۙwx;Za̘ЅlĘgabOO!= AKA ðSZ (^ U)U_!?N—^{M=:g;3KmstbϾ/;m>j4%k0o݋J<=+Oޏ/ki 05O IKL*7`O2TtmE_;>Ð Iq'"(^ U)U_!?֣umof:V g6vTdKAa|NF?r"Է?T6IX~X|Aj2t]ufX8ú Gݜw)+GP0[ӣ^2\TxJFDuN;i쮪~dMqT>IeX~O< 2vI{ }7GVN91 G'ə_ M3NAw^zq5gCxz qWr_#5e^: ?rfT1F񹡊-?:~ o}eS )+{3PsȀ!\.30CWFnTogfy}gI[}X0NACgo2be݁H<+k%(!\l.Y.lLI*b<'} Elّcux})[Cdt kZ7 04pW1~wDao>J赚]VƉ-ѭ YY82_iiC[nͅ,enɓcd8}赳s|GCZY9B~{5>'Gv\|̋05O e32u=*˚x STwc݋J<=+ܣ.ܞN7EffTQl^ieƢ+>fe]%zF3 #cX@?7,k ThZeX7]ՈsSr_M{ysmL8R_}8D-)~&jR,H@Fe P7*&M{IuQnTdOT`2jĹ5~ELon['ܷgCF1aMEQ-dXtWBE@v)Tb-˜o^5lɃc8{|mgk`s P 붫nqIFBi-I]82[L&YkQrWaΫ6d >ɟeX]Ոwk~>H2:}wnw%*z})f'~)0vSR0IM&{ }E;ub{r,/^֣jxY_q Cx9EW+D{=?oN^$8D-348_. [u7ykaPiV^'R驫#Z (M)Ux_!(uUl3x7eO3\8wQiɼ!wMMՊ9pLhK'Wzꨖqv*sqx@+ƒ4/ECKvC^dYKaTEJZᱧO2 5k1Np̲mʪh5X?4@W} Adyf<aks2.LUCeї)ȸ}vc͹\Nͧkgawa/h/ g Vz,_]/oBS> nxf8^RaݫQK;ž,q|CW*]"T[~X}1_ÈbP'3%jހP%Bz\yö=>Kؒ9(,%υmjJA穜íMh榪'OՓ%T>rc݁IH| 0u{4eįp~Ph[3pY9~?̾e:븍Mf_K_fcr7hY)a #ƞUJxS(=/m~nVpiVJ6^yjE3? \`5}Ulٗc8~)]HǸyCx:Tr%[u &MGJz772\eޱ7ii|n||4 {Շxj:0R#]]2Jy$A:CUᩳɭpQ-I%X抮1ao /lV8V?wѳfa`h'h _!什=-Nh T5ěL.cyIzelVI͚vy6J!^KN،T^TCI̩;Kc`e>$69kHr\^_}`|ȶk"٥N}edǞ0pn$el$ݻyߛ s_z6#hʰP 8'!sSM<!_>ZY2#Y(Ǧye9$T Ƚ],>~H+/]Y-VJʚ@ЈT5PD6_IVsx vJ6L;~1+/}Y{`ċ!&UGP*> QmO2!ݗb'39lg'gzoa>]\zCT0I Xb1&_kP9v)?iY' &2qvEFqvШ?+(I\3IFSb N }5.û 4]d;ۂD(%G 3x- lן>mW->p>ͪ/ he;P^<.=A%/tXWakŸ O)l`].h5e4ɷ|vbͷ$NM$jcq*[F|ǵ ӣ8 '+fΨ%cٮ'uk"&6;k/uVF'f\%< J==+J_b{4pGfan_ʄ Ӏbڹc4 K' UF˱b{L\zS< B~pҗ܋MGkN~Cf'S8f4[$~5A_F[~e=PTթgkgabOO!= GR{=Q.'..'sa{ҏ5r65Ț n *˱b@t }u9?0W'{xju}e WaTMnf('/W 0b)j츥v:įٗ`. 89*0]zS< B~x4pI}15b3\/\3lof f4'kڭPҥ:%:j2qaa/`9wBWz3os7G0 'q"p10È i&-Y-$~fs[cUlٗc8~ _mu\K< Cxz qWrߎƾjD5X>*pS)GBi힫3{n^Xs>F=IKӨ b>@W}mGQ%do'8u;,'cxj_ XF^ߗٲegG% l҇DP\PM)U_!}J{J6}} )\re;77 ?aʽBM*H".{@Ulٗc8~)aC$ukgabO0?ͽ^ 2ޡ :?zak O8{-cT kev|\o$LujRu\KԼŋJ<=+-F|k}ako6_WN$<_/kw'LujRu\K< Cx:Tʙ+C6i4),5O ) 4ljsL{׆*n/ ּg\EfSD-PS4B~aߒuk#U\״ ˼Br%p3bVf_. -ڋX~eMuNMkgabO琎+ _!?ŊK\+*d3\ :V r0MVaώ#;Rư,.&q*įO_}8ԅM-!<9K_}"PH!fSiP%}9_7 KU#Ny\Qy~%ʁH{;ٮEҌptg~)p٨u{J|XMT2Np12Tg_a7@BF25P%Bz\ܣp[FGÇܿak O8HhWLK9hc6Ͼ0թIq-Q/**ί//@;bPJ1(SQc/D;Qh* FWRXC0|h]5b̳{1TWq~ %<x \s_Rh#p0ӄ I-h,_6z-F}dͼutNMkXg0s8 3|vyo(F;D\&@e_dz3fXpSS% 4Pے6Yւ };m*6ʱ2ܾf͕FG7Ab?O<.b=8iG' .;.R8GvpgTE5r,[~mtz}a"TjM\M>foHJDt4jHaAd-:N{c0a1d7 ϳpga|08 Ȏw Tא &Hŝ*˱2Q~c܉yF{zqW繟.TmO3%I^,r {rX]~@ΗBͩk0ophb?= ` DokS= 7t ٟ KYOdWS <[p`UVnuLv= DV@5P}qU vݩxF|"b.Gk3}hI?8=_ l@Ly<1ljVAJk%{|B{PtOž|j>BG`qD/Td~qT猐'tlt vU0Pr8|}vrw,4 .yg:氂=kwEdYٴ/1x?E&WkSVwE4iSϼ]̈.6A/^6Wz4Fp/5`;Px6/2Fһrf3{#͗.X/WkoGtF?^{8?_Sg ѝN)ų2..Un2pO7@%#K`a|ha0#XW޽ty6rL](2g ˁzh۪#4;ŏ${=-jX!Ȫn1Ky$^/ϳ~H|t\hsm;%$ҹ'yÚ ٶ/x̘< ǧì(wF_:0^źcoKu>p*.'v?Q30kQcjmwgKujxЂml]d'hvW 6,%7>_Gmӥ/B=y§I`Epldvg4￿2taK'9z2Ծ2geGC|Nlw3|z삆h1 y>_|įaC |Yݷ;Bj_nC-d䅻īۓ)!JT./7/KXn+6JxcCşhR |DBh.!P:)8znM))ѣ;oy:zi̲<N)?jșn5\~"t[m>_#_<7[;e&ͨ{FTlCIhU)1A;P4UUU̥1%&C1ljQIx 9Nj>`쎎FXȪ.l6c?vYU:A#29lcUݱ;JG ؎2(8惽;d .&>^a) b8xT1Gj3!w!5HGQ;#חjI_RC _=*$%>pU@&oF*% F, FA/Ze?Cŀ~樌ثZf8?;65չh,!s{ TX՜MS"*H xn ]Ց;_ZK9IZG`W؛!>%4WBN.*ڛc5b\i~Ec3Ϫ&,dTLMU'{8-ΞQ7dLfZGXs֣}P5pї/ 2:eȄFTTLWUHJ؃{>y gЙI=IdClcUQh Ȁf15Ic]޸xEgCƽ*k.ϕ66h`vxiCUo5vEvWb˨լd 7`͟qT# XybceBdح6mкjR`c0]U5~!2&^Dl.NJ,6G7lCFece$ƙ2KBS]Ue[ vD&C6Lņ?gy:dTnF׻3Je@=uOޒp 3]M+U{}> q't?8. N\*hmycH'T5ĺ0|F22*Fk٩[_^v%yRiq-M6RB%"գ؞pUFLQUkdav-9Dz$*Ch)J iSf߾<$YDױD^m"{bvWf4L PQ3FSubDSxY[xBC1jH٢hGk6} JC$Fk02~=!R⯚v>M2]*Cam^X V,s Ygd¿fq+Zε >QҷAb1&:&t@T8#K 0+v8]JH?TXڥ eTcqQ~ 1HT|#-T%FMJM[{c:xѤd U) ~i55մz(1$ZJn}DzYJTY 3bUk)Q՞w[ČȄGdTLWUwG(}w.`vq&o#4ī ]v͘}F ꌒAh$"eQ@c1X aZ< ]P{ȸAvWh'Au!X;6+C*?#X&bŦ]o REKЂyq džma:9'=${0ymٰ$8c2=V1+v9+jr8Fcrt#$3ջy%>\N݇~e9 l@E</5Nߴ؎{*ۤc֌{){ 6­iR[t&Qc"Y-Vou&M*t+z+0wV!4"aĴ-~UϜ516^U>QQ>4k>( 1q2dRTճZ-mNݼ\(ׇ>FUG_|qcRm6+ZAx@B k XP~f )5]4<<=x߃{;e c!a'QE!14 bc0M_UIEAPɬ!8BɎg-@c^g)MkZwL9&S3V=ƀ n(Rjj;~or)UlZJ[u nyU)F 3xZa'%&\PHa (~(v 15]UB0js7y<C:\vۋ Ŋa*UFIa;+_CH 4JLbSUD:T A& :c-@qlqx>ČfQ؇otfD&G7 3bl;~G(sîq]?hUR`Sɏ`J {|V,U5H?TLK F ~8 a:ȇ]v!3wxX(Jux 463!gqld ʉj%OUUx,ӈL8Jl EG_u, 0 3 ]PK>|5ǒV*aTP6K@oBk(SH_ۃCĿP "6`j"*Jë΀BǻH b%2ї1.EGQRhBh<1IѴڹ2`z C j*VQل o8jeN)=޵:0Q*5M'$@XB?=O8OeG5W>8X̤U;l*4MV5PˈuE;:yg@px1r_6NcCe狘є}kÔ$D0Q̘C*%< ~7ں[jjϙ1PRᏨZ=o+p-7vN`(s@dĄm D%ꚲUHyjJ (vGTJ#K1й$`W>'rRTjaX+X"ə(RE;8y2UA[7z.(K`|mڿJDwoƋw<?ĬMT X.V <"~8 P#e3Q bjZ}o3|.WJEY[D GRG!ao( LYUŰ!ƫG6Q$Q65I{>~(ɟJ¾?|'A~G="x4@tHXPoo31fYCE'zÒ8=bP|Z\b/0'詀WC!6DQw(U}eʉQ7lD86,)vk _w}f, S >n} U v۵$_('$V;VM2(d_<H:_J/aIQ!5X^u̬`V2kWDuw/% 8(ZRPZP#FEXƥkhAŀ~$X,Z8(ɑzuܞSCpvҼ5Qǜ8 !)r;-?v'Db!e m(`2E'mcCj)8h.Z RلkXPil v1զAE yտ>c %6zk5A؞S:Vua(/aK#29lc(.WC4c_^.#ن͆рP%ΏMa*ƫߟb(mƁ0}{ [bQ;7ڔ3!4U7/VQ 8QDF* կ*;42,M+-N7o-6XBjGm("&dΈqR2H!Ј*VJ1Ű!G_u e<U2ݎ*Fb!!dKǃ|5ǒV.VFUA`Gd#a"fQz!J= AW4My6asۭܡrF=z֯/ei̿@It, _ho#M endstream endobj 12 0 obj<>stream x]K$7r0roQnY4^/a&#.i@ گbϟu/?|ϟlXB?_e]w]KL?b./dV{ɬ4 }]7Q,'}&]LX3O?6.J;3>b/qKQ`ElN"ư-惍! <2W>2i@W@%fX<]ͮ"l> ]KI`Clptr-tJG$B?'}\2`̈ A֢n2bۥ"q h,$ Ijol2)X @tU'#eF$BdMd"̒u:G5>lZ>asÇMm`7ai5˖rv10*Zܥeی/ÜƦw`3Cžä3mmbK?=]-FÇonF$\ m0cŸ:ѵ "/9߇OZIg7`% oOD^4X"VFo 5^+6!eV6ǎ Q0AH]=X&'}SL{7[u  ނ3t )"0+|@#wHCK )Ri5mBV#"鶘{aVS",0$1\44 9@!ּTRcygH t[1"TDY2b Yqΐl ghj [ȭUVt&"Jzg*x`=O&zH*CѬq v$ȷ!8G\9 7aC c'G1b 3q&e_tH#dJx`AM{E,'tEt9qC#!x2-8C<X<u  5ltw[mڌDϑ+P5u(@Q+MaHUN Y3BaE'< z0쩗b6ŌO b\`DHշ eBQm : vm^o04DV#M V(t8JGn%7QdQS NsC t(i:Ȍ:eV= B:M~kRpԉ B0sXOiR7V|χ;?A)5_#`W6sUÙ #ypoJ_Q@>4>[NJ_AD/6bB]B O! GzKp[W mk%1SĠm[,J?tɥqr|LT[mgH8AC!LKJbDo^+r0Ù.nL"-2WضJx` 8q{%2l Ὶ(RgGC6ȢMP_;NlۿaWDP+ [!yWl 쪾&>R[kh߱A;B3 0J+V/Gь{* PUЕ['h4r2AHK_dU 3G Ͷut޹\cI+"K :$`Odf RX?>ՀR_ _XX6Oy$VɗgGouow:n*i=Ci2-CB3,U#GE)/&ndDYF$2 hd="ʂD^.ĽK^QC@!@Yn eF SB 3,6#ZgQefe>T 9V6ȱHs"-ۛ!?y(!@8A{lnܐ)s [tFػP,tll%7Nǘeɬ_QI938E[``('xi)s{KIAob P=a%!o?{YR&@K,`ɸ`q%@f +H~Yp{/Ԗufa^ZjdEA$)Ep•Գ6Z7_/ I߄տ}6 ;GѶPXKZ (> 9ߖv͹P%{c׉ʊRߏ]H.|vET8{6X汌-^۶cMv"Q.sWJe偛.zk4GFB *W#ֿbI+D9оJR`i(9xLlHr05]2# )u E)btֹf@tNNplm CA|zދnxL XBZKQ39t\Ѩ3^0kR)XFSPQv /e6B3 `YmM@flA(# %Rwΐihlz) -P6 #( !J!+1 ZH\iEi&JA@tA?ƨ%puD1 ݝH/'~OsƊeOθZ =8Dt>nn7;̌mItؿHin2e[LjV:QQCc6tCumLgR7\]GoZq+5 a(5 r?s?A+ nP$1xb!+иqO6wٓi +1%k2۱G[!^W"/h2vۮ:dG=)%AF+4=*ˉ)m#~:춨n J}/ym+axyL+/bWDmӉzY AT_DZ\U a⹏%^_| s&`sptU9јI|=%eWjmX?s;J',) aw~Ro:t{ppO Kg8? ΁98'{tL,dlx^R:V>F{r̀hWe! (" (U8DA}@ 72hҙېURgd@)]#߭84HXN7 'S p#IMIEospWΞd-%KTހρYkPP)K|˫(+둧ssu^0;y >M8NyExhNwiw^MiȩCC>^Fxu^@lIP?b -b2h 3{ *sw3moW<ʔ#EUpf91:7 !zvZ{A-Ov'D C=Y'"QFl^әF'?^ٸqNٸȰ&)C ~|9~ SQ~EW|$~G?fl5Nad*""C: |J sTW"7 F[:!374*$ SYeJO>{9'̔ji>im+r B@/t7n>ˑC#2MDE"X/s@8ỸĎJ%! x{N'@,$5?Pd a6.s58kg_ {!{#GXB b;Ju=3$|tiizHÊ7 =iV~{ۻKҾF=~G$k5ΐp<{ Nϲu܎lc3)AI&G |el< jXcs; kwW$wXvޑS]Ɏ?}]n;y]NszZ ܻ{oFm}{K,ʇ=vVw临q7>jc'`tnܴ~ (E|ܐx{x݃7gT=p. \w=GG|0垇oTO5~8 ފ t+\0ʑ4w*7>=pCpw~zLMÏ)3j ԗ꧇Mzi|@&gx~ӻq4TF j\us FC>Mr&[kiXZTZi k>Q||xq,O-}gWCL&y2aBU eiYa &.. m&]1y M:k}O儮[r>kycںK|lx馡s ', x«,%:BQ7ɹ=O(ZiU4}^7ߖ=qٌ`)ũ8O!_)-8Ƨ{ #glCT=pzZΫӪ'Jk;UoƝ+@oi ;dwpzS|HBЗ޻@e#85OE,|G Rݨ[L6}hW#VfjO;|4MIBc`{M]kŢ&7[%]*qt޵DcW}Jf XZpn8@7}ž{3|o,j qO7/zs) ؟Rp{aLL)<}ҫay}~7g*]*ckܜ$+7h=G4TbKܳP @D6++'Tl;k|]5,*fDka6i&!j{ުH%S+;wr롖" ޥ&9ze3,L ;774:u"t7ԭW`$!@#= v;"׵@HZQ\Q1f5茆*G˅Tya[!1]z}]Rt)Bvc'p}_:[F f9}&߿羉z54tCy˺[ُ{WIsȇePDdiVM)W0y #rm* Uy=*L-E >9vP>;th @|v 62+޺<Ӭ+Kik: 6J{;%kI;* jy%M#JFtØ`r >r;Sv^Ûp\$Rw?-o 22eX:.$< w"$L(oI6sry+Ȝk-\˧PsFֲwe2ABXH lK:G]t&ft__֯ꩵ2r;D|!w_ރ#~W|OGS'|q䁏ZV->w/?W\Aq~5A 'hF^,DnX{ WGcP?]vNѼ,*PtIy-Av_4 gY3Zy}2 ].ZfqmU0c?d8*(uK@[G 78_Ѽ{f8yGW Whه.ǻ>`̬4DL`V;ZIڂ`!bvipg(vj-m4o`1H.^qV22zhwIhr8:(.E0Qq+䆽BnW |O endstream endobj 13 0 obj<>stream x wǙJ_pL/xCrDst %aLhN2DEKW]Td$2<*S2:_IUFm!#1dfR32$ãB 1)ǥ8"cye4 nñ8ϑєf#)sqN .X2m3.2?3A% &#(@f7fHqg&ア. IEQ @fXCL!W "#)C&ӄQd38"fZR,,w^M~?vǸ͓g:tчG?<8 /oXT2b}IKTbY/C`-.(;$)ƛ,S)P6 7@7h[^ 4D\niJKG-)m}Tу^ |$q)Tn—`M z,-J@YdST{LVhg\RnHHE.9 "82UUO鶖9q +i+Y Yx[M6p]ښ9a4^K&kClI wP%79ơxlYR@4Z9.˜uxl\EgKnuT9U AJF饵A&Kʃ֣m!Ea+pc`31_Z,6eQKy(&&f#LX9.Py6ـ3A/B(ت@MB$2o CveDK0OCyBo B*(V̡ L|lx^p]A`hb3nXGɆ00 b1*pXOɆ]Ca)0LJ(˜VQ(<7P b!&°sSx(ei7#d*PS#' 3OĖ8.H܏S$wDlN*xP" Щҕ!6`*w,4%ע04`O:M6y°`L:#dڐZ*58EuСDhUGFV٢P֠L:U(]GɆ59͊l K]8.Ixfr;էX/aepGG+Q#.6ـDh (^݅&y Ҁ NEQÓ3x[/x OښF53T j~!&D`D{r •AaJX6j7yAlyN/S0rl` st!1(&PXU49Y&ܛèMp;Qr@tTl-Bɡ@ uVbhǽw!8$'VJ&%tْ`!D^)xŠm ` %ĒyBx=4&/ 2Q=ӶH QmKu1B90 ,+:M6twzX8|PF:G#$^ttl0 g[xTA9#Dv&T d)Q n`=:M6Q[l-6(AAk([J.Qَnr;5ؤp~:0:h6p%\J2Ptpn9o[k!0|l-%j nA%rZG4JlGfGA #dG@]e_# (Hy%+M䦄k0s{nwLl -&E/\~U;}RaCՅ:G{*A+:M6A~Zr ΢ia) 0l(Wil/ʎi PrR #fSmaz !]("1gU8 ;M6 .> *5D4wj)L+(7<D cZYHyaEfcd``)M6@@{1f8c\Ƕ3»9O`{sХ"ѱmâ cV`L-' ldl#5MXm 8eIآvAN ,ֱcX 7Rz)9BX/meQX12f>a{gTull(.JyɴL3m)--l{C/@,%ͶaYH|}'[<%:VFsoJ|C˼Jm`@; <%k|jC_ 8;`[nÅCV`~cŇ\b| Sa:BrQ]ĺ:@@j*0/\N;1R70b &1D6%`YY/h@?1 *in65Be59Lz:nvԈѻɤ?dHGiN''quVLbd'{ćgg߼띍ם=z=7qMV'2;Hfл({~4ށȿHmv_w3e;MN>]ɲu*;dt9/sL%hJo[lJZjQaql•Jgջ j7Fd>Lܫm7}ҥ &uN"#A1MFXn4^O:y79ߏv*m\?Ujp<A6u9 zL\L.G5m,Dq ɇޠ{|?ëgq8y;c/ /." MwObR %fG!b 6=fB_jU  q S'?9c9>?'Óbx~֯F\>~n>&Pʴbpf"qu~^ ajV+ƴˇAl__'f4>hרRxzU첚 &u7ౚj[5SH0T_?{8z n{ݯ_D؎G{rփy5[;|;|"oF]*XYF7.?⿳?+(U,Ó"nenxCVס9\g"_" y]Tyu}0n w0gSw{φtN ano᧍fe]o4"Bk黵)k`x9Fӄ{lZר,iOi5Ha+&T|M첄 ji| vt&wtb7|~Qc)rE5F ͇,?z-rǫ>AsW-ގ.V#Aq'Ȧ癑l RKD 3awI.,•rVDGL;T"ֶ˧lQ;AUbYy68F1G (X\&+ך)IkBj\֜0Y/&19AP.4vq*tyMh3p9ͳHaDXҥR9f>dfhMaT%Jl2̾62["˺˹X.W&`y`rj&ab&ab:Lr&Fa#K2Nex} ׎I R a(n~MĵEѯAyr~ D]+Jyi-'2VD1>-NJNJrKGbHt<9iBigQ7#Qˑ#̦?_|[ɮ=R%zQIt|[`_h\HɕdBJ#Cɍ́!T?ȐSidYqkT&?gZQ_#dsm1x,qCp̦w5G=>Yu^*{0|Q4y}V`͙#HiWh) ܊Z03E(=à2OuXl׏$r$3jqwxxjF w/\̂qfFn`m'~ts׿d#s~8nYO 6߭9gy5Y_}l.r8.,:ko^˦ $OʟwEJIIIIIIIIkNe&RR$15'7@ZU'`Z_emo:N&}}t֭󷽳cTix=qܼB^Ԏg @ѸZ.|oG`ZSnnmMwDιWhX%i쨦#7rJ-8B6S㦱W|;,6Tc66TcJ]d+TnP .A͹qCݶj~gWAȮfuƅ4 ZfͧB)꛿J{} V)b/)b/)b/)b/nMO{I{I{ImVp gע)Jʃ?`EdV+܃פKKKKy(]Y ^  e*J˰s`^^4x*TSO%JۧB*gj!b=Vrj}[NaÏ/%hq]D+dZϽjUowymjw/>\3ؘoԾ?^j ?O9R9!7gve5Ϩlb~1]g֌Wy&.bۿ)=F5?iDy$R[j Lµ ɜH ]`0|!\R+ݘ6d ڠ2%%[ 8n3;8^ɭ6C| FƋږHDaժT%^Z+N?.~\nB!yԚ@Vnж H&ej#d~NA˻\!PVjbK-מ$HP"AE *Tl%.UKH(Je,TE` *T$HP"AE[A!w(5JxC,C1Oo&U>{$ }>Lz/oFؐuFg;oW栭E 0ei|\^Ւ0'a~Z'CYX_ '!ZsG$I0fR/ Aq,yI)ߗ0+ HOI1?LppTƸˁ^,O?ՅW9~rFI|ö?Ȟ`U݃'ON>dlW|';X Ww2]+Cڗ/|ެ6=Wؖ||v1>f4ǰ[_Zmۆؕ+9UU`H8DfPhu#Փ!Fޯr,҃Go1.U67&ǐG KXjf?]`P7wjLOLgC;f4m%Բ.!>/k`vߝgy9BcyoWƍS<$z~Qc_2֗ߞ vϫ=})/S7-oP#y[q-~}jׄZZ>]hR5ﱸ4`!ȹRm5kKGn`̜wG.f0sx[@ < x,?;ܸ zó5ߏuc1F&^p%s Nw__=<ЯNN~Y=Ϭ^u:T~[ N#A63 `, avڏ"1 ?CSEγ{"&,QueE}ɢ `ﲙ$䂿nce Ab\LjG,.'VlgJ.&X!4Ϙک]l9"f D1V)bAg"W Xz1XH8lz,qlgl5+kVtdjcV;v57d8Q3xK(%_jdzeF_5/5aj>u~:*SSi7ht_(KGJ8 LZgJdT?]U_O_[q .Mݼ4w].z|`΂ vW~.nv{Έ\:қU~wlCKs}AD\F\YjvJ2+Ӊ]uiY^M2٦iY9\aMH%X%HWdbkHvhm?Y'!hMa>J|]Th:h"leטd8b)- .2_T{{s0ۍsS7*;Σb x'~ʵSÞo䳖rcBD=IDuP*b*~ -jT!ThAsJW2c`qk//&jYSӛu3E[ϪQIyt8.CQ/|yh^xPzdU=d'I=&>չiBN4YD欟oRe|F3+FÃObRMAȴG&ܚd4fƬe'۶2554o*3373bJs΅'«"<Bnt^~7dK.ٺd~ {S{R#W 9'hwo1?_Fh1iɇ ږ#>:t:Ms1 ݆)~o޼iRϷu!pϗ{\Qi\IObN0"#gƭs9Z'h)-4i; v{)*{.^q"n#S<*qvO2&_eB<;zyܭ񯡜8x^Oey皺r/Ѥy\_6"[(Sl䏯=%Yz獓tAR9[ eKlN`8kA+ןhx/Qn>yܿfy]]9m\Jvn~r[?0kSS%},J S3"aI^eq}!0 [u tP]nƴJۛ+T4OUiE\l,b*)x"\ e-uͿV25Ɨ`)UǬ[_].^vZR7J~Zv~,{hϤON_.ں^!^=2 U|q&.@m8[ epOh]b]qӊo^bя@Y@E+޴.%:ѮWz?6# + NfKV:O>9O>9}PBRU m!-Q'|r'oC-Ds,4+璃O>9O>9ߠec>JKv`8<|~p3Zg{o~?~xcպKu JY*ț 7O}3W|IN|EJ^ bHv%9?ݝ? G$ f{֯}m/g!_~Ɋ^ v mkP+vu&>BDw:wI E3Pdw#;6.DzqU6shӢrwÙ;uMw4{[\U/SKGI~5A[LJ\sOom]s!+P2?޽Csvd6^s7WlRMxWai ?MUۣi^W etIT8"Jiyf{gSWiT3"݆'RRkX֛ۖ7 _yv_} zF[Ϋ>#Z;GΔpD6+ssV6Cضo&y o%D&#A[}Nvj؋uӵUY-JPT-TB1P1>>E+`QS6P3v缔2!r(/!FSL_*RL#4RL#4RL#|,!8CDWa$)$H#G?W vFhVЂKy?$H#E*`M )D+ϙLpR _u:B-B[qkA{yCk^W;қW DhNmc.OEdo]<4~CX+qÄ_?|`$$K--<X#]=}?6MHHǽLHErOIla5-5/G G  $?R#=m8ɭᢤ[.-[sEa]w^2m-42f[tdK.w>+]N6Vv{Knpl K#/nZ0][rkԾteΙySD7 }ED a)"")""JjerV , ?$H#G_g V,JI{A'ܗӂ?$H#ǽGeAB yIVD_fc;d%iu7džgEڮMkz )T>u27IwlUsK"$3Aߵ.g,Hq}[HDX0nX~Ь}'\"'¨Z a]L" ' 0y|#]H-/ Ë+w}u峃 P 00 AH"*pV>2)))?3Z* JZXbYQK%oi[Zk$--yKqO;eάd`=Fɢ( y(HHHJӠ !x wL~!H>b>b###։)>S8_zżt N,yX IL"1Eb)S$5Q( , 3:䦴% "1Eb)S$1bAB $Ε Iu\Jcb)S$HL^3km<8(D;#RNL"1Eb)S֘ª;@ΈRQCsrኂ[d,0aχIoT h̽ܯud1WIv0Ɋo9-!\nfJ 7u|Х7Of}Ϛ\\^6*\:w|Z]A/-rL160osES:)^RxAbt>n{D^rxp*$Ks|1bN('r1ʵH+ƥ"௛CR끏pTdc Fx<eoQU(_cSǯ|ن}X( p*ZV=ICB#9!p˂ tAaIݒ%ujk,=D)Bs"XIBQ.LI-[m F!Hj0 =:d4O [bz9S>Fodai͊>t(I2 ]]EETO+wGW]vn&[ǓzFcv* /G'JU ˘rr@lݪm6tKqSFźLRm'}Ɣ.G(2\FIîd2y'2N|1;]dG/R8y _qtSfE^ɆhU<{9:F_.{p!rĪ>/i?;%bnY;b2~֙7Ѭ%fJאlvvM~+NfaGg7S7dW$/9^jllf mt,n43$2?;f('dY,HLώca8#$?ts3chllu'Gw߫;{m.z.h[bB|4:0[ӷ\} vekWLJTWm|fVrz䳤-Ȃ4grN?}\ޔ&?J{Gbb4:!:mP/5him MX[\:׏`9Tw,<4n?Ӌ8ۭW;~F0\ E@.K@t<7:,rQ2<wxo!1ò>sߕe8^|}U8<`,&G/V}l<#/_ܗ]-xͶhپ|U ŝ/, Ϣ:i?[5ǏFq5lw/m|ehSMZ#&TBZ*S w&OJצ3'I( KfL)Db1:e]~xW>-_fV83d ,uPS%Ϩ6:aRE`ը چ+vVdGE>rwRڦ︙Og2MQ&+7s_ʒelgAb5YL)sDI6nVgU[o-~=<]|ˏoM[91@4iw!SNMНu!Uzι6A'-R3CB. qoAoΔ>ˍ<ؼ: 4)}R3.- ^ȈP0镡6]ۤqqq9$% ^B̥i wJ/sEr!20yiK4ia|*rw6ΠI wu8ǻ{{ _e?-Ƚ5ϡb㽋aφN޼+gLݣM%Dc0m\@I jF:{6peϿϻ}7).kKz4ͷ4xv hm j1G%lZ~-] &P*)SK(H۽, {{(sShrKZphUKTwY`8}yܥ=?%{tPYrjL.@* 1#C(aOgo:بF(Sgq8:/NwdъTg2~g#G@dx\=7qmׄ!* endstream endobj 109 0 obj<>stream application/pdf PDF Architect 6 2019-05-10 2019-05-10T23:07:50+02:00 PonyProgFT-1 Claudio Lanconelli Schematic, Assembly llPDFLib llPDFLib 3.x endstream endobj 111 0 obj<<12A1B8DA64709C639B770DBE93DA3C12>]/Size 112/Length 88/Type/XRef/Filter/FlateDecode/DecodeParms<>/Index[0 112]/W[1 3 2]>>stream xcb&Fc'ǩHg9P 9202Egmȓi}l4GQֻ SyC/dev/null if [ $? -ne 0 ]; then echo "ftdi_eeprom command not found!" exit 1 fi set -o errexit FILECONF=ponyprogft.conf if [ -f "${FILECONF}" ]; then NL=`grep -c -e "serial=\"FT[0-9]\+\"" "${FILECONF}"` if [ "$NL" == "1" ]; then ZNUM=`grep -e "serial=\"FT[0-9]\+\"" "${FILECONF}" | cut -d '=' -f 2 | cut -d '#' -f 1 | cut -d '"' -f 2 | cut -c 3-` #output e` il numero a 6 cifre preceduto da 0 per es. 000002 #echo ${ZNUM} #rimuoviamo gli zeri inizali lasciandolo in base 10 NUM=$((10#$ZNUM)) #echo ${NUM} ((NUM++)) NEWSERIAL=`printf "%06u" ${NUM}` echo "NewSerial: ${NEWSERIAL}" sed -i.old "s/serial=\"FT[0-9]\+\"/serial=\"FT${NEWSERIAL}\"/g" "${FILECONF}" ftdi_eeprom --device i:0x0403:0x6014 --flash-eeprom "${FILECONF}" if [ "$?" -eq 0 ]; then echo "Success!!!!!" exit 0 else echo "Failed" #Restore original mv "${FILECONF}.old" "${FILECONF}" exit 3 fi else echo "error NL != 1. $NL" exit 2 fi else echo "File non esiste: ${FILECONF}" exit 1 fi tmp9balx013/Hardware/PonyProgFT/eeprom/ponyprogft.conf0000644000175000017500000000244613616566001023045 0ustar carstencarstenvendor_id=0x0403 # Vendor ID product_id=0x6e38 # Product ID max_power=500 # Max. power consumption: value * 2 mA. Use 0 if self_powered = true. ########### # Strings # ########### manufacturer="Eurek srl" # Manufacturer product="PonyProgFT" # Product serial="FT000020" # Serial ########### # Options # ########### self_powered=false # Turn this off for bus powered remote_wakeup=false # Turn this on for remote wakeup feature use_serial=true # Use the serial number string # Normally out don't have to change one of these flags in_is_isochronous=false # In Endpoint is Isochronous out_is_isochronous=false # Out Endpoint is Isochronous suspend_pull_downs=false # Enable suspend pull downs for lower power change_usb_version=false # Change USB Version usb_version=0x0200 # Only used when change_usb_version is enabled cha_vcp=false cha_type=FIFO # Only used on FT232H chips (when omitted, use chip defaults) # Possible values correspond to enum ftdi_cbush_func. cbush0=TRISTATE cbush1=TRISTATE cbush2=TRISTATE cbush3=TRISTATE cbush4=TRISTATE cbush5=TRISTATE cbush6=TRISTATE cbush7=TRISTATE cbush8=TRISTATE cbush9=DRIVE_0 group0_drive=8mA eeprom_type=0x56 ######## # Misc # ######## filename="eeprom.bin" # Filename, leave empty to skip file writing