unit UnitMisc;
interface
uses sysutils, HexUtils, classes, boots, dialogs ;
type TPhInfoRecord = record
Name:string;
PhType:string;
Model:string;
MCUSW:string;
PPMInfo:string;
HWID:string;
PCI:string;
APETest:string;
RFIC:string;
DSP:string;
APECoreSW:string;
APEVariant:string;
Retu:string;
Tahvo:string;
CNT : string;
APEHW:string;
APEADSPSW:string;
LSN:string;
APEBT:string;
PrdSerial:string;
ProductCode:string;
ModuleCode:string;
BisicPrdCode:string;
IMEIPlain:string;
IMEI2Net:string;
IMEISv2Net:string;
Bat:string;
Cam:string;
CMTbtver:string;
LCD:string;
FLic:string;
CRR:string; //результат сброса кода на дефолтный
PrdCok:string; // результат записи продукт кода. Стоит перманентный - проверка реализована в коде.
APEic:string;
end;
type TRPLRecord = record
NPC:string;
CCC:string;
HWC:string;
SIMLOCK:string;
SIMLOCK_KEY:string;
SUPERDONGLE_KEY:string;
CMLA_KEY:string;
WMDRM_PD:string;
end;
function PhModeToStr (mode:integer):string ;
function rawtotemp(raw:Integer):string;
function PathConv(path:string):string;
function FindDescr(filename:string):string ;
function FindNam(filename:string):boolean ;
procedure repairdata();
function getkeycode(kw:Word):string;
function getkeystatus(data:Word):string;
function convertcnt(imname:string):boolean;
function SelLoaders(IdR:string):boolean;
function affenabled():Boolean;
function SecondToTime(const Seconds: Cardinal): Double;
function showtime(time:cardinal):string;
procedure endtimecount();
procedure starttime();
var
RPLRecord:TRPLRecord;
PhInfoRecord:TPhInfoRecord;
Smart:boolean;
ConMode:integer; //0=USB, 1=COM, 2=...
RM:string;
typeinf,Generation,Crypted,datapos:string;
fileexist:Boolean;
//filesize:Int64;
currproduct:string;
M:TMemoryStream;
zad:Integer;
TypePHstr:string;
csbyte1,csbyte2,csbyte3,csbyte4 : Byte;
SWver:string;
Floader,Sloader:string;
StartDir:string;
tmsstart,tmsstop,tmsres, opstart, opend : Cardinal;
fbdev:integer;
implementation
uses Unit1, forms, UsbMain, windows, UnitE1;
const
SecPerDay = 86400;
SecPerHour = 3600;
SecPerMinute = 60;
function SecondToTime(const Seconds: Cardinal): Double;
var
ms, ss, mm, hh, dd: Cardinal;
begin
dd := Seconds div SecPerDay;
hh := (Seconds mod SecPerDay) div SecPerHour;
mm := ((Seconds mod SecPerDay) mod SecPerHour) div SecPerMinute;
ss := ((Seconds mod SecPerDay) mod SecPerHour) mod SecPerMinute;
ms := 0;
Result :=EncodeTime(hh, mm, ss, ms);
end;
function SelLoaders(IdR:string):boolean;
var s,s1:string;
begin
Result:=false;
Floader:='';
Sloader:='';
if Pos (IdR,'0003192103002107000C1921030021070003192103012107000C192103012107000C1921030221070003192103022107')<>0 then begin
Floader:=StartDir+'Flash\RAPUv21_2nd.fg';
Sloader:=StartDir+'Flash\RAPUv21_XSR17_alg.fg';
Result:=true;
exit;
end;
if Pos (IdR,'4003192102001104400C1921020011046003192102001104600C1921020011046003192102011104600C1921020111046003192102021104600C1921020211046003192102031104600C192102031104')<>0 then begin
Floader:=StartDir+'Flash\RAPUv11_2nd.fg';
Sloader:=StartDir+'Flash\RAPUv11_XSR17_alg.fg';
Result:=true;
exit;
end;
s:='0203192102004000020C1921020040000203192102024000020C192102024000020C1921020041000203192102004100020C1921020141000203192102014100020C1921020140000203192102014000';
s1:='020C19210203400002031921020340000203192102024100020C1921020241000203192102034100020C1921020341000203192102054100020C1921020541000203192102044100020C192102044100';
s:=s+s1;
if Pos (IdR,s)<>0 then begin
Floader:=StartDir+'Flash\RAP3Gv40_2nd.fg';
Sloader:=StartDir+'Flash\RAP3Gv40_XSR17_alg.fg';
Result:=true;
exit;
end;
if Pos (IdR,'22000209200C0000220002092003000022000509200C00002200050920030000')<>0 then begin
Floader:=StartDir+'Flash\BCM21351_usb2nd.fg';
Sloader:=StartDir+'Flash\BCM21351_XSR16_usbalg.fg';
Result:=true;
exit;
end;
if Pos (IdR,'220000092003000022000009200C000022000109200C00002200010920030000')<>0 then begin
Floader:=StartDir+'Flash\BCM21351_D0_usb2nd.fg';
Sloader:=StartDir+'Flash\BCM21351_D0_XSR16_usbalg.fg';
Result:=true;
exit;
end;
if Pos (IdR,'22000209200C0000220002092003000022000309200C00002200030920030000')<>0 then begin
Floader:=StartDir+'Flash\BCM21351_E0_usb2nd.fg';
Sloader:=StartDir+'Flash\BCM21351_E0_XSR16_usbalg.fg';
Result:=true;
exit;
end;
if Pos (IdR,'22000209200C0000220002092003000022000309200C00002200030920030000')<>0 then begin
Floader:=StartDir+'Flash\BCM21351_E0N_usb2nd.fg';
Sloader:=StartDir+'Flash\BCM21351_E0N_XSR16_usbalg.fg';
Result:=true;
exit;
end;
end;
function PathConv(path:string):string;
var
Len:integer;
s:string;
sw:WideString;
begin
sw:=UTF8Decode(path);
Len:=(Length(sw) shl 1)+2;
Result:='';
s:='';
SetLength(s,2);
word ((@s[1])^):=Len;
WordSwap(@s[1]);
SetLength(Result,Len+2);
BufCopySwapWord(@sw[1],@Result[1],Len);
Result:=s+Result;
end;
function PhModeToStr (mode:integer):string ;
begin
case mode of
0 : Result := 'PowerOFF';
1 : Result := 'Normal';
2 : Result := 'Charging';
3 : Result := 'Alarm';
4 : Result := 'Test';
5 : Result := 'Local';
6 : Result := 'Warranty';
7 : Result := 'Reliability';
8 : Result := 'SelftestFail';
9 : Result := 'SwDl';
10 : Result := 'RfInactive';
11 : Result := 'IdWrite';
12 : Result := 'Discharging';
13 : Result := 'SwReset';
end;
end;
function rawtotemp(raw:Integer):string;
var
temp:integer;
begin
case raw of
// temperature from raw
570..579:temp:=0;
560..569:temp:=1;
550..559:temp:=2;
540..549:temp:=3;
530..539:temp:=4;
520..529:temp:=5;
510..519:temp:=6;
500..509:temp:=7;
490..499:temp:=8;
480..489:temp:=9;
470..479:temp:=10;
460..469:temp:=11;
450..459:temp:=12;
440..449:temp:=13;
430..439:temp:=14;
420..429:temp:=15;
410..419:temp:=16;
400..409:temp:=17;
390..399:temp:=18;
380..389:temp:=19;
370..379:temp:=20;
360..369:temp:=21;
350..359:temp:=22;
340..349:temp:=23;
330..339:temp:=24;
320..329:temp:=25;
310..319:temp:=26;
300..309:temp:=27;
290..299:temp:=28;
280..289:temp:=29;
270..279:temp:=30;
260..269:temp:=31;
250..259:temp:=32;
240..249:temp:=33;
230..239:temp:=34;
220..229:temp:=35;
210..219:temp:=36;
200..209:temp:=37;
190..199:temp:=38;
180..189:temp:=39;
170..179:temp:=40;
160..169:temp:=41;
150..159:temp:=42;
140..149:temp:=43;
130..139:temp:=44;
120..129:temp:=45;
110..119:temp:=46;
100..109:temp:=47;
90..99:temp:=48;
80..89:temp:=49;
70..79:temp:=50;
60..69:temp:=51;
50..59:temp:=52;
40..49:temp:=53;
30..39:temp:=54;
20..29:temp:=55;
10..19:temp:=56;
0..9:temp:=57
else temp:=0;
end;
Result:=inttostr(temp)+' C';
end;
function FindNam(filename:string):boolean ;
Label vp1;
var
Fn: System.Text;
s,name,styp:string;
i:integer;
begin
Result:=false;
System.Assign (Fn , filename) ;
System.Reset (Fn);
while not EOF(Fn) do begin
System.Readln(Fn,s);
if Pos('',s)<>0 then begin
System.Readln(Fn,s);
while Pos('',s)=0 do begin
if Pos ('',s)<> 0 then begin
name:='';
i:=Pos ('',s);
i:=i+6;
while s[i] <> '<' do begin name:=name+s[i]; i:=i+1 end;
end;
if Pos ('',s)<> 0 then begin
styp:='';
i:=Pos ('',s);
i:=i+13;
while s[i] <> '<' do begin styp:=styp+s[i]; i:=i+1 end;
if styp='Mcu' then core:=name;
if styp='Ppm' then if ppm<>'' then ppm1:=name else ppm:=name;
if styp='Content' then if image<>'' then begin
if ape<>'' then cnt3:=name else ape:=name;
end else image:=name;
end;
vp1:
System.Readln(Fn,s);
end;
end;
end;
System.Close(Fn);
if core<>'' then Result:=true;
end;
function FindDescr(filename:string):string ;
var
Fn: System.Text;
s,ProdName,ProdCode,ProdVer,orFN:string;
i:integer;
begin
SWver:='';
Result:='';
ProdName:='';
ProdCode:='';
ProdVer:='';
orFN:='';
System.Assign (Fn , filename) ;
System.Reset (Fn);
while not EOF(Fn) do begin
System.Readln(Fn,s);
if Pos('',s)<>0 then begin
i:= Pos('',s);
i:=i+13;
while s[i] <> '<' do begin ProdName:=ProdName+s[i]; i:=i+1 end;
end;
if Pos('',s)<>0 then begin
i:= Pos('',s);
i:=i+13;
while s[i] <> '<' do begin ProdCode:=ProdCode+s[i]; i:=i+1 end;
end;
if Pos('',s)<>0 then begin
i:= Pos('',s);
i:=i+11;
while s[i] <> '<' do begin ProdVer:=ProdVer+s[i]; i:=i+1 end;
end;
{if Pos('',s)<>0 then begin
i:= Pos('',s);
i:=i+18;
while s[i] <> '<' do begin orFN:=OrFN+s[i]; i:=i+1 end;
end;}
end;
System.Close(Fn);
Result:=ProdCode+' '+ProdName+' ver '+ProdVer ;
if ProdVer<>'' then SWver:=Prodver;
end;
procedure repairdata();
begin
GETRoot[9]:=$01;
GetBlock[7]:=$0D;
GetBlock[8]:=$00;
GetBlock[9]:=$0E;
end;
function getkeycode(kw:Word):string;
begin
case kw of
$0030:result:='0 [DIGIT]';
$0031:result:='1 [DIGIT]';
$0032:result:='2 [DIGIT]';
$0033:result:='3 [DIGIT]';
$0034:result:='4 [DIGIT]';
$0035:result:='5 [DIGIT]';
$0036:result:='6 [DIGIT]';
$0037:result:='7 [DIGIT]';
$0038:result:='8 [DIGIT]';
$0039:result:='9 [DIGIT]';
$0023:result:='#';
$002A:result:='*';
$E001:result:='PWR';
$E003:result:='LSoft';
$E004:result:='RSoft';
$E005:result:='SEND';
$E006:result:='END';
$E007:result:='UP';
$E008:result:='DOWN';
$E00A:result:='VOL+';
$E00B:result:='VOL-';
$E00C:result:='OK';
$E00D:result:='LEFT';
$E00E:result:='RIGHT';
$0E5C:result:='CAM';
$0008:result:='Clear [C]';
$F852:result:='Menu';
$F884:result:='Pen';
$F842:result:='LSoft';
$F843:result:='RSoft';
$F80A:result:='DOWN';
$F809:result:='UP';
$F808:result:='RIGHT';
$F807:result:='LEFT';
$F883:result:='CAM';
$F88F:result:='CPrew';
$F881:result:='Fplay';
$F886:result:='FfW';
$F880:result:='FRew';
$F845:result:='Ok/Select' ;
$F863:result:='END';
$E05C:result:='CAM';
$E05D:result:='CFocus';
$F862:result:='SEND';
$E060:result:='Play/Pause';
$E061:result:='Play[Rewind]';
$E05F:result:='Play[Forward]';
$F856:result:='Play[Forward]';
$F854:result:='Play[Play/Pause]';
$F855:result:='Play[Stop]';
$F857:result:='Play[Rewind]';
$F847:result:='Slide[Down]';
$F84A:result:='Slide[Down|PlayMode]';
$F84B:result:='Slide[Up|Close]';
$F846:result:='Slide[Up|Open]';
$F80B:result:='Pen';
$F858:result:='MMedia key';
$F840:result:='VOL+';
$F841:result:='VOL-';
$F887:result:='Camera Lens open';
$F888:result:='Camera Lens close';
$E002:result:='Slide Open/Close';
else result:='UNKNOW KEY';
end;
end;
function getkeystatus(data:Word):string;
begin
case data of
$000D:result:='Press, long press, repeat';
$000F:result:='Press, Release, Long press, repeat';
$0003:result:='Press, Release';
$0001:result:='Press';
$0007:result:='Press, Release, Long press';
$0083:result:='Press, Release';
$0010:result:='Slide up';
$0020:result:='Slide down';
$0030:result:='Slide down/up';
$0048:result:='Slide down/up many times';
//E0 0C 00 08 shorted
$0008:result:='Possible shorted';
else result:='UNKNOW';
end;
end;
function convertcnt(imname:string):boolean;
var
buf: array[0..$3FFFF] of byte;
HdrLen,
HdrSeems,
CurrSeem,
CurrSeemLen : Integer;
ImagePageSize : Word;
i : Integer;
res, NeedConvert : Boolean;
fs : TFileStream;
ms : TMemoryStream;
f5 : Boolean;
begin
imname:=image;
Form1._msg('ConvertImage: Processing '+ExtractFileName(imname));
try
currseem:=0;
f5:=false;
fs:=TFileStream.Create(imname,fmOpenRead);
fs.Read(buf[0] ,1);
if buf[0]<>$B2 then
begin
Form1._msg('ConvertImage: Image file is damaged');
fs.Free;
exit;
end;
fs.ReadBuffer(buf[0], 4);//Длина Flash-header'a
HdrLen := HexToInt(IntToHex(buf[0], 2)+IntToHex(buf[1], 2)+IntToHex(buf[2], 2)+IntToHex(buf[3], 2));
fs.Seek(4,soFromCurrent);
HdrSeems := HdrLen+5;
while fs.Position2 then form1._msg('Unknow Image-file');
fs.ReadBuffer(ImagePageSize, CurrSeemLen);
if ImagePageSize=$1100 then
begin
NeedConvert:=false;
Form1._msg('ConvertImage: Page Size is 128K, no need convert');
result:=false;
fs.Free;
Exit;
end else
if ImagePageSize=$1000 then
begin
NeedConvert:=true;
form1._msg('ConvertImage: Page Size is 64K, need convertion');
continue;
end else form1._msg('ConvertImage: Unknow Page Size :( ');
end;
fs.Seek(CurrSeemLen, sofromCurrent);
end;
end;
fs.Free;
if f5=false then begin
Form1._msg('ConvertImage: cnt size not detected');
exit;
end;
if NeedConvert then
begin
ms:=TMemoryStream.Create;
Form1.Image64to128(imname, ms, Res);
if Not Res then
begin
form1._msg('ConvertImage: Error converting to 128K Page Size');
ms.free;
Result:=false;
exit;
end;
Form1._msg('ConvertImage: File converted');
ms.Seek(0, sofrombeginning);
ms.SaveToFile(imname+'_128');
Result:=True;
ms.Free;
end;
except
on E:Exception do
begin
fs.Free;
Form1._msg('ConvertImage Error: '+E.Message);
Result:=false;
end;
end;
end;
function affenabled():Boolean;
var
i:Integer;
begin
result:=True;
if (Form1.chkCheckRead.Checked=True) or (Form1.chkReseLt.checked=true) or (Form1.ChkAFFset.checked=true) or (Form1.chkBootNormal.checked=true) then begin
Application.ProcessMessages;
Sleep(1000);
Application.ProcessMessages;
Sleep(1000);
Application.ProcessMessages;
i:=0;
if catchdevice<>$01 then
begin
repeat
Application.ProcessMessages;
Sleep(1000);
Inc(i);
Application.ProcessMessages;
until (catchdevice=$01) or (i=100);
end;
if (i=100) and (catchdevice<>$01) then begin
Application.ProcessMessages;
Sleep(200);
Form1.SetReady;
Form1.TimConChk.Enabled:=true;
Form1._msg('Flashing Failed! :( Maybee HW error, or Downgrade try???!');
Form1._msg('');
Form1.DisconnectFill;
Result:=false;
Form1.chkPPMe.Enabled:=True;
Form1.chkMCUen.Enabled:=True;
Form1.chkPPM1e.Enabled:=True;
Form1.chkCNTe.Enabled:=True;
Form1.chkAPEe.Enabled:=True;
Form1.chkcnt3.Enabled:=True;
end;
Form1.TimConChk.Enabled:=true;
end;
end;
procedure starttime();
begin
tmsstart:=0;
tmsstart:=GetTickCount;
end;
procedure endtimecount();
begin
tmsstop:=GetTickCount;
tmsres:=tmsstop-tmsstart;
fltime:=fltime+tmsres;
end;
function showtime(time:cardinal):string;
var
sec:Integer;
begin
sec:=0;
sec:=(time div 1000);
result:=FormatDateTime('hh:nn:ss',(SecondToTime(sec)));
end;
end.