unit UnitMisc;
interface
uses sysutils, HexUtils, classes, Windows, 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;
Variant: string;
end;
type TUkeyData = record
Hash: string;
PID: string;
Key: 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 SelLoaders(IdR: string): boolean;
function affenabled(): Boolean;
function SecondToTime(const Seconds: Cardinal): Double;
function showtime(time: cardinal): string;
procedure endtimecount();
procedure starttime();
function FbusSelLoader2nd(IdR: string): boolean;
function Select2ndDie(idr: string): Boolean;
function NextPos(SearchStr, Str: string; Position: Integer): Integer;
function LastPos(SearchStr, Str: string): Integer;
function getsub(b: byte): string;
function getasic(b: byte): string;
procedure UkeyClear();
function convertimages40(imname: string): boolean;
function checkcnt(imname: string): integer;
var
RPLRecord: TRPLRecord;
PhInfoRecord: TPhInfoRecord;
UkeyData: TUkeyData;
Smart: boolean;
ConMode: integer; //0=USB, 1=COM, 2=...
RM: string;
typeinf, Generation,
Crypted, datapos: string;
fileexist: Boolean;
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;
directmode: Boolean;
apeexist: Boolean;
FbusFloader,
FbusSloader: string;
FASICcmt, FASICape: string;
cmd_buf: array[0..$FFFF] of byte;
algo: string;
fbdev: integer;
fbnum: string;
devbyte: Byte;
ROOTKEY: string;
boot_done: Boolean;
imei_global: string;
bof: integer;
furCMT: byte;
FLtype: string;
UFsretry: Integer;
flven: DWORD;
stop, operation: Boolean;
ppmlang,
ppm1lang,
s1ppm: string;
ppmselect,
ppm1select: Boolean;
flicven: DWORD;
sltststart,
sltstsend: Integer;
ltdata: integer;
psi: string;
DataHeader: array[0..53] of Byte =
($F1, $00, $21, $00, $03, $D1, $12, $4A, $6F, $72, $6E, $61, $64, $61, $20, $44, $65, $6C, $20, $4D, $75, $65, $72, $74, $6F, $DD, $17, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FC, $02, $00, $00);
dataheader2: array[0..53] of byte = (
$F1, $00, $21, $00, $03, $D1, $12, $53, $65, $72, $69, $65, $73, $20, $34, $30,
$20, $52, $65, $73, $74, $6F, $72, $65, $20, $DD, $17, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $FC, $02, $00, $00);
Zerobyte: Widestring = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' +
'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
implementation
uses Unit1, forms, UsbMain, UnitE1, UContent;
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 Select2ndDie(idr: string): Boolean;
var
s: string;
begin
result := true;
idr := copy(idr, 1, 5);
FbusFloader := '';
FbusSloader := '';
case Str2Byte(idr[1] + idr[2]) of
$BA:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAP3Gv3_BA';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_BA';
bof := 2;
end;
$9D:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAP3Gv3_9D';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_9D';
bof := 2;
end;
$E9:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAP3Gv2_E9';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_E9';
bof := 1;
end;
$38:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAP3Gv3_38';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_38';
bof := 2;
end;
$A5:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAP3Gv3_A5';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_A5';
bof := 3;
end;
$9A:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAPIDO_9A';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_9A';
bof := 3;
end;
$CA:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAPIDO_CA';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_CA';
bof := 3;
end;
$F2:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAPIDO_F2';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_F2';
bof := 3;
end;
$F6:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAPIDO_F6';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_F6';
bof := 3;
end;
$FC:
begin
FbusFloader := StartDir + 'Flash\UFS\Special\RAPIDO_FC';
FbusSloader := StartDir + 'Flash\UFS\Special\Cboot_FC';
bof := 3;
end;
else result := False;
end;
end;
function SelLoaders(IdR: string): boolean;
var s, s1, s3, s4, ss: 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;
{ s3:='0103192101003000010C1921010030000103192101013000010C1921010130000103192101003100010C1921010031000303192101023000030C1921010230000303192101033000030C1921010330000003192101002000000C1921010020000003192101002100000C1921010021000003192101002200000C1921010022';
s4:='000003192101012200000C1921010122000103192101001101010C1921010011010003192101001002000C1921010010020013192101001002001C192101001002';
ss:=s3+s4;
if Pos (IdR,ss)<>0 then begin
Floader:=StartDir+'Flash\RAP3Gv30_2nd.fg';
Sloader:=StartDir+'Flash\RAP3Gv30_XSR14_alg.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 affenabled(): Boolean;
var
i: Integer;
begin
Form1.btnFLASH.Caption := 'Stop';
stop := False;
Form1.btnFLASH.enabled := true;
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(500);
Application.ProcessMessages;
Sleep(500);
Application.ProcessMessages;
i := 0;
if catchdevice <> $01 then
begin
repeat
Application.ProcessMessages;
if stop = True then i := 1000;
if i = 1000 then Break;
Sleep(100);
Inc(i);
Application.ProcessMessages;
until (catchdevice = $01) or (i = 1000);
end;
if (i = 1000) and (catchdevice <> $01) then
begin
if stop = true then
begin
form1._msg('-------AFTER FLASH BREAKED BY USER-------');
form1._msg('');
end;
Application.ProcessMessages;
Sleep(200);
Form1.SetReady;
Form1.TimConChk.Enabled := true;
Form1._msg('-> Flashing Failed! :( Maybee HW error, or Downgrade try???!');
Form1._msg(' Anyway - try reinsert battery and PowerUp phone manualy');
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;
Form1.btnFLASH.Caption := 'FLASH';
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;
function FbusSelLoader2nd(IdR: string): boolean;
var s, s1: string;
begin
Result := false;
FbusFloader := '';
FbusSloader := '';
if Pos(IdR, '008815B0008815C0008815C1008815D0008815D1008815D3') <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\nomadik8815_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\nomadik8815_alg.fg';
result := true;
exit;
end;
if Pos(IdR, '008815A1') <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\nomadik8815A1_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\nomadik8815_A1.fg';
result := true;
exit;
end;
if pos(IdR, '171007001710070117100702171007031710070417100708') <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\helen3_2nd.fg';
if pos('OMAP1610 GBBM-1.8.1', algo) > 0 then FbusSloader := StartDir + 'Flash\UFS\h3_sam_nand_gbbm.fg' else
begin
case flven of
$00A100EC, $00A1002C, $00780098, $00360098, $003600EC: FbusSloader := StartDir + 'Flash\UFS\h3_sam_nand_xsr.fg' //APE ALG0 Ver 1.49.0
else FbusSloader := StartDir + 'Flash\UFS\h3_xsr15_flash_alg.fg';
end;
end;
result := true;
exit;
end;
//OMAP2420 UNISTORE-II-1.5.1 ALG // teflon_sam_nand_xsr151_m1.fg
if pos(IdR, '24200703242007042420070524200706') <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\omap2420_m1_2nd.fg';
if Pos('OMAP2420 UNISTORE-II-1.5.1', algo) <> 0
then FbusSloader := StartDir + 'Flash\UFS\teflon_sam_nand_xsr151_m1.fg'
else
if Pos('OMAP2420 UNISTORE-II-1.2.1', algo) <> 0
then FbusSloader := StartDir + 'Flash\UFS\teflon_sam_nand_xsr_m1.fg'
else FbusSloader := StartDir + 'Flash\UFS\OMAP2420_XSR15_alg.fg';
result := true;
exit;
end;
if Pos(IdR, '0003192101002000000C1921010020000003192101002100000C1921010021000003192101002200000C1921010022000003192101012200000C192101012200') <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\RAP3Gv2_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\RAP3Gv3_algo.fg';
result := true;
exit;
end;
s := '0103192101003000010C1921010030000103192101013000010C1921010130000103192101003100010C1921010031000303192101023000030C192101023000';
s1 := '0303192101033000030C1921010330000103192101001101010C1921010011010003192101001002000C1921010010020013192101001002001C192101001002';
s := s + s1;
if pos(idr, s) <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\RAP3Gv3_2nd.fg';
case flicven of
$89820089, $89810089: FbusSloader := StartDir + 'Flash\UFS\RAP3Gv3_algo_v1331.fg';
else FbusSloader := StartDir + 'Flash\UFS\RAP3Gv3_algo.fg';
end;
result := true;
exit;
end;
s := '0003192101001203000C1921010012034003192101001203400C1921010012030003192101002003000C1921010020034003192101002003400C1921010020034003192101011103400C1921010111034003192101021103400C1921010211034003192101031103400C1921010311034';
s1 := '003192101011105400C192101011105400C192101021105400C1921010311054003192101051103400C192101051103400C1921010511054003192101051105';
s := s + s1;
if pos(idr, s) <> 0 then
begin
FbusFloader := StartDir + 'Flash\UFS\RAPIDOv11_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\RAPIDOv11_algo.fg';
result := true;
exit;
end;
if Pos(IdR, '0003192103002107000C1921030021070003192103012107000C192103012107000C1921030221070003192103022107') <> 0 then begin
FbusFloader := StartDir + 'Flash\RAPUv21_2nd.fg';
Result := true;
exit;
end;
if Pos(IdR, '4003192102001104400C1921020011046003192102001104600C1921020011046003192102011104600C1921020111046003192102021104600C1921020211046003192102031104600C192102031104') <> 0 then begin
FbusFloader := StartDir + 'Flash\UFS\RAPUv11_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\RAPUv11_algo_xsr16.fg';
Result := true;
exit;
end;
s := '0203192102004000020C1921020040000203192102024000020C192102024000020C1921020041000203192102004100020C1921020141000203192102014100020C1921020140000203192102014000';
s1 := '020C19210203400002031921020340000203192102024100020C1921020241000203192102034100020C1921020341000203192102054100020C1921020541000203192102044100020C192102044100';
s := s + s1;
if Pos(IdR, s) <> 0 then begin
FbusFloader := StartDir + 'Flash\UFS\RAP3Gv4_2nd.fg';
FbusSloader := StartDir + 'Flash\UFS\RAP3Gv4_algo_xsr16.fg';
Result := true;
exit;
end;
end;
function LastPos(SearchStr, Str: string): Integer;
var
i: Integer;
TempStr: string;
begin
Result := Pos(SearchStr, Str);
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
begin
for i := Length(Str) + Length(SearchStr) - 1 downto Result do
begin
TempStr := Copy(Str, i, Length(Str));
if Pos(SearchStr, TempStr) > 0 then
begin
Result := i;
break;
end;
end;
end;
end;
// Search for the next occurence of a string from a certain Position
function NextPos(SearchStr, Str: string; Position: Integer): Integer;
begin
Delete(Str, 1, Position - 1);
Result := Pos(SearchStr, upperCase(Str));
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
Result := Result + Position + 1;
end;
function getasic(b: byte): string;
begin
case b of
$00: result := 'CMT';
$01: result := 'APE'
else result := 'UNK[' + byte2str(b) + ']';
end;
end;
function getsub(b: byte): string;
begin
case b of
$00: result := 'NOR';
$01: result := 'NAND';
$03: result := 'NAND'
else result := 'UNK[' + byte2str(b) + ']';
end;
end;
procedure UkeyClear();
begin
UkeyData.hash := '';
UkeyData.PID := '';
UkeyData.key := '';
end;
function convertimages40(imname: string): boolean;
var
CNT_PN_Sector: Byte;
res: Boolean;
image: string;
fs: TFileStream;
ms: TMemoryStream;
buf: array[0..$3FFFF] of byte;
begin
result := False;
Form1._msg('ConvertImage: Processing ' + ExtractFileName(imname));
Application.ProcessMessages;
fs := TFileStream.Create(imname, fmOpenRead);
fs.Read(buf[0], 1);
fs.Free;
if buf[0] <> $B2 then
begin
Form1._msg('ConvertImage: Image file is damaged');
exit;
end;
GetPageSize(imname, CNT_PN_Sector, res);
if not res then
begin
Form1._msg('ConvertImage: Error Image file converting');
exit;
end;
if pos('_128', imname) > 0 then CNT_pn_sector := 128;
if CNT_PN_Sector = 64 then
begin
Form1._msg('ConvertImage: Page Size is 64K, converting...');
Application.ProcessMessages;
GetFlashArea(imname, {EraseArea,} res);
if not Res then
begin
Form1._msg('ConvertImage: Error Image file converting');
Form1._msg('');
exit;
end;
ms := TMemoryStream.Create;
Image64to128(imname, ms, res);
if not Res then
begin
Form1._msg('ConvertImage: Error Image file converting');
Form1._msg('');
ms.Free;
exit;
end;
Form1._msg('ConvertImage: File converted');
ms.Seek(0, sofrombeginning);
ms.SaveToFile(imname + '_128');
result := True;
ms.Free;
end
else
if CNT_PN_Sector = 128 then
begin
Form1._msg('ConvertImage: Page Size is 128K, no need convert');
//Form1._msg('');
Application.ProcessMessages;
end
else
begin
Form1._msg('ConvertImage: Unknow Page Size [already 128?] ');
//Form1._msg('');
exit;
end;
end;
function checkcnt(imname: string): integer;
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('CheckImage: 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('CheckImage: Image file is damaged');
fs.Free;
result := 0;
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.Position < HdrSeems do
begin
Application.ProcessMessages;
//Form1._msg(IntToStr(fs.Position));
fs.ReadBuffer(CurrSeem, 1);
//Form1._msg('curr : '+byte2str(CurrSeem));
Application.ProcessMessages;
if (CurrSeem = $E4) or (CurrSeem = $E5) or (CurrSeem = $EA) or
(CurrSeem = $EE) or (CurrSeem = $F3) then
begin
fs.ReadBuffer(buf[0], 2);
CurrSeemLen := (buf[0] * $100) + buf[1];
fs.Seek(CurrSeemLen, sofromCurrent);
end else
begin
fs.ReadBuffer(buf[0], 1);
CurrSeemLen := buf[0];
if CurrSeemLen < 1 then fs.ReadBuffer(CurrSeemLen, 1);
//Чтение текущей разметки image-файла
if (CurrSeem = $F5) then
begin
f5 := True;
if CurrSeemLen <> 2 then form1._msg('Unknow Image-file');
fs.ReadBuffer(ImagePageSize, CurrSeemLen);
if ImagePageSize = $1100 then
begin
NeedConvert := false;
//Form1._msg('ConvertImage: Page Size is 128K, using direct mode');
result := 2;
fs.Free;
Exit;
end else
if ImagePageSize = $1000 then
begin
NeedConvert := true;
//form1._msg('CheckImage: Page Size is 64K, using 2-stage mode');
result := 1;
fs.Free;
Exit;
end
else
begin
//form1._msg('ConvertImage: Unknow Page Size :( ');
result := 3;
fs.Free;
Exit;
end;
end;
fs.Seek(CurrSeemLen, sofromCurrent);
end;
end;
fs.Free;
if f5 = false then begin
//Form1._msg('CheckImage: cnt size not detected');
result := 4;
exit;
end;
except
on E: Exception do
begin
fs.Free;
Form1._msg('CheckImage Error: ' + E.Message);
Result := 0;
end;
end;
end;
end.