
Бывалый

Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008
Репутация: нет Всего: нет
|
Всем Добрый день! Мой знакомый занимается ремонтом мобильных телефонов, ну и соответственно имеются программаторы для восстановления ПО. В интернете есть программы, которые написаны в DELPHI, например http://papuas.allsiemens.com/Joker.htmЭто программа для Сименсов. У меня возникло несколько вопросов. Возможно ли сделать программу для телефонов Sony Ericsson, которая могла бы уметь прошивать, читать инфу и тд? Где можно почитать подобную информацию? Как мне известно, в каждом моб. устройстве, стоит процессор, флешка. Как узнать, в какой области памяти лежит EEPROM например( или gdfs)? Кто сталкивался с этим, поделитесь опытом Мне удалось найти такой исходник(для SE K500/K700): | Код | program SonyEricsson_K500_K700_terminal; uses CRT, DOS; {$M 58000, 0, 655360} (**************************************************************** * Phone CPU memory mapping: * Flash: 0x44000000 - 0x46000000 (32 MByte ) * PSRAM: 0x4C000000 - 0x4C800000 (8 MByte ) (Now reading not available) * Flash2(K700i): 0x50000000 - 0x52000000 (32 MByte ) * GDFS: 0x44F00000 - 0x45000000 (1 MByte ) * ******************************************************************)
const
USAGE='k500term[Порт[Скорость[Четность[Слово[Стоп]]]]]';
LCR=3; (* Регистр управления линией 0x3fb *) MCR=4; (* Регистр управления модемом 0x3fc *) LSR=5; (* Регистр статус линии 0x3fd *) IER=1; (* Регистр идентификации прерываний 0x3f9 *)
(* Маски для установки бит в регисторах *) GPO2=8; (* Сигнал для разрешения портных прерываний от схем RS-232C *) R_INT=1; (* Прерывание по приходу байт *)
(* Константы, относящиеся к контроллеру прерываний 8259А *) IMR=$21; (* Адрес регистра масок прерываний *) ICR=$20; (* Адрес регистра команд *) IRQ3=$F7; (* Маска для разрешения прерывания от COM2 *) IRQ4=$EF; (* Маска для разрешения прерывания от COM1 *) EOI3=$63; (* Сигнал об окончании обработки прерывания от COM2 *) EOI4=$64; (* Сигнал об окончании обработки прерывания от COM1 *)
(* Маски для установки бит в регистре управления модемом *) DTR=1; (* Сигнал готовности терминала *) RTS=2; (* Сигнал запроса на передачу *)
TRRDY=$20; (* Маска для определения готовности порта к передаче байтов *)
BSIZE=4096; (* Размер кольцевого буфера *)
ESC=$1B; (* ASCII код символа Esc *)
comm_port=1;
max_size=5000; (* Размер и массив, используемого как буфер при чтении данных из файла. *)
max_size1=31*2048;
type mass_of_byte=array[1..max_size] of byte;
(* Глобальные переменные *) var p_base: integer; (* Базовый адрес последовательного порта *) oldvect: pointer; (* Старый вектор прерывания 0xB или 0xC *) eoi: integer; (* Сигнал об окончании обработки прерывания *)
buf: array[1..BSIZE] of char; (* Кольцевой буфер *) inptr:integer; (* Указатель на 1-е свободное место в буфере *) outptr:integer; (* Указатель на 1-й считываемый байт *) sys_timer:longint absolute 0:$46C;
procedure write_hex_byte(i: byte); begin if (i DIV $10 <= 9) then write(i DIV $10) else write (chr(ord('A') + (i DIV $10) - 10)); if (i MOD $10 <= 9) then write(i MOD $10) else write (chr(ord('A') + (i MOD $10) - 10)); end;
procedure write_hex_word(i: word); begin write_hex_byte(Hi(i)); write_hex_byte(Lo(i)); end;
procedure write_hex_longint(l: longint); begin write_hex_word(l Shr 16); write_hex_word(l); end;
procedure write_hex_string(s: string); var i: integer; begin for i:=1 to length(s) do begin write_hex_byte(Ord(s[i])); write(' '); end; end;
procedure print_sys_timer_H46C_cycle; const MaxY=24; var c: char; begin ClrScr; if KeyPressed then c:=ReadKey; GotoXY(1,MaxY-1); writeln('sys_timer='); repeat GotoXY(1,MaxY); write_hex_longint(sys_timer); until KeyPressed; end;
procedure monitor( mb:mass_of_byte; k:integer; n:integer); var i,j:integer; first_string:boolean; begin first_string:=true; for i:=n+1 to k do begin if(first_string) then begin write_hex_word(i-1-((i-1) mod 16)); write(' '); for j:=1 to n mod 16 do write(' '); first_string:=false; end else if(((i-1) mod 16) = 0) then begin write_hex_word(i-1); write(' '); end; write_hex_byte(mb[i]); if((i mod 8) <> 0) then write(' '); if((i mod 16) = 0) then begin write(' '); for j:=i-15 to i do begin if ((mb[j] < $20) or (mb[j] > $7f)) then write('.') else write(chr(mb[j])); end; writeln; end else if((i mod 8) = 0) then write('-'); end; end;
procedure test_monitor; var mb:mass_of_byte; i,j:integer; begin ClrScr; GotoXY(1,6); for i:=1 to 1000 do mb[i]:=Lo(i - 1); monitor(mb,256,0); readln; end;
procedure my_delay(n: integer); (* Процедура организации задержки, кратной 55мс и независимой от быстродействия компьютера. n= 18 - 1 сек. 36 - 2 сек. 72 - 4 сек. *) var l: longint; begin l:=sys_timer; Inc(l, n); repeat until l=sys_timer; end;
function portbase(pnum: integer) :integer; begin p_base:=MEMW[0:$400+2*(pnum-1)]; if(p_base = 0) then portbase:=-1 else portbase:=p_base; end;
procedure setparm(baud: longint; parity: char; w,stop: integer); var divisor: word; parm: byte; begin if(p_base = 0) then exit; parm:=PORT[p_base+LCR]; divisor:=round(115200/baud); PORT[p_base+LCR]:=parm OR $80; PORT[p_base+1]:=divisor SHR 8; PORT[p_base]:=divisor AND $ff; parm:=parm AND 7; case parity of 'S','s': parm:=parm OR (7 SHL 3); 'M','m': parm:=parm OR (5 SHL 3); 'E','e': parm:=parm OR (3 SHL 3); 'O','o': parm:=parm OR (1 SHL 3); end; parm:=parm OR (((stop-1) SHL 2) OR (w - 5)); PORT[p_base+LCR]:=parm; end;
procedure i_handler; interrupt; begin buf[inptr]:=Chr(PORT[p_base]); Inc(inptr); if(inptr >= BSIZE) then inptr:=1; PORT[ICR]:=eoi; end;
procedure porton(pnum:byte); var i_num,c: byte; begin if((pnum = 2) OR (pnum = 4)) then i_num:=$0B else i_num:=$0C; GetIntVec(i_num, oldvect); SetIntVec(i_num, @i_handler); c:=PORT[p_base+MCR] OR GPO2 OR DTR {OR RTS}; PORT[p_base+MCR]:=c; PORT[p_base+IER]:=R_INT; c:=PORT[IMR]; if((pnum = 2) OR (pnum = 4)) then begin c:=c AND IRQ3; eoi:=EOI3; end else begin c:=c AND IRQ4; eoi:=EOI4; end; PORT[IMR]:=c; end;
procedure portoff(pnum: byte); var i_num,c: byte; begin c:=PORT[IMR]; if((pnum = 2) OR (pnum = 4)) then c:=c OR (not IRQ3) else c:= c OR (not IRQ4); PORT[IMR]:=c; PORT[p_base+IER]:=0; PORT[p_base+MCR]:=0; if((pnum = 2) OR (pnum = 4)) then i_num:=$0B else i_num:=$0C; SetIntVec(i_num, oldvect); end;
function portin: word; var w: word; ch: char; b1: byte; begin if(inptr <> outptr) then begin ch:=buf[outptr]; b1:=$00; Inc(outptr); if(outptr >= BSIZE) then outptr:=1; end else begin ch:=Chr(0); b1:=$FF; end; w:=(b1 SHL 8) Or Ord(ch); portin:=w; end;
procedure portout(b:byte); var tm: integer; begin tm:=-32000; while((PORT[p_base+LSR] AND TRRDY) = 0) do begin Inc(tm); if(tm > 0) then exit; end; PORT[p_base]:=b; end;
procedure beep; begin Sound(770); my_delay(9); NoSound; end;
procedure init_com_port; var port:byte; (* Номер используемого порта *) speed:longint; (* Скорость обмена *) parity:char; (* Контроль по четности *) _word:byte; (* Число информационных бит *) stop:byte; (* Число стоповых бит *) code:integer; s:string; begin ClrScr; writeln('Terminal on PASCAL for SonyEricsson K500/K700 mobile phone.'); port:=comm_port; speed:=115000; parity:='N'; _word:=8; stop:=2; if(ParamCount > 5) then begin writeln(USAGE); beep; halt; end; if (ParamCount >= 1) then Val(ParamStr(1),port,code); if (ParamCount >= 2) then Val(ParamStr(2),speed,code); if (ParamCount >= 3) then begin s:=ParamStr(3); if(Length(s) > 1) then begin writeln('Неправильно задана четность! ',s); writeln(USAGE); beep; exit; end else parity:=UpCase(s[1]); end; if (ParamCount >= 4) then Val(ParamStr(4),_word,code); if (ParamCount = 5) then Val(ParamStr(5),stop,code); if((port < 1) Or (port > 4)) then begin writeln('Неправильный номер порта ! ',port); writeln(USAGE); beep; halt; end; if((speed < 50) Or (speed > 115200)) then begin writeln('Неправльно задана скорость! ',speed); writeln(USAGE); beep; halt; end; if((parity <> 'N') And (parity <> 'O') And (parity <> 'M') And (parity <> 'S') And (parity <> 'E')) then begin writeln('Неправильно задана четность! ',parity); writeln(USAGE); beep; halt; end; if((_word > 8) Or (_word < 5)) then begin writeln('Неправльно задан размер слов! ',_word); writeln(USAGE); beep; halt; end; if((stop > 2) Or (stop < 1)) then begin writeln('Неправильно заданы стоповые биты! ',stop); writeln(USAGE); beep; halt; end; if(portbase(port) = -1) then begin writeln('COM port ',port,' not present!'); beep; halt; end else begin write('Address COM',port,'='); write_hex_word(p_base); write('h'); writeln(' скорость=',speed); end; inptr:=1; outptr:=1; setparm(speed,parity,_word,stop); porton(port); end;
procedure SendString(s:string); var i:integer; begin for i:=1 to Length(s) do portout(Ord(s[i])); end;
function convert_nible(ch:char) :byte; begin if ((ch >='0') And (ch <= '9')) then convert_nible:=Ord(ch) - Ord('0') else convert_nible:=10 + Ord(ch) - Ord('A'); end;
function input_hex: byte; const Baskspace=Chr($08); var ch: char; (* Рабочая переменная *) s: string[2]; dummy: boolean; w: word; begin s:=''; repeat repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin write_hex_byte(Ord(ch)); write(' '); end; until KeyPressed; ch:=ReadKey; if(Ord(ch) = ESC) then begin portoff(comm_port); halt; end; ch:=UpCase(ch); if (ch = Baskspace) then begin if(Length(s) <> 0) then write(Baskspace,' ',Baskspace); s:=''; end; if (((ch >='0') And (ch <= '9')) Or ((ch >='A') And (ch <= 'F'))) then begin write(ch); s:=s + ch; end; until Length(s) = 2; input_hex:=16*convert_nible(s[1]) + convert_nible(s[2]); end;
procedure hex_terminal; var b: byte; begin writeln('procedure hex_terminal.'); writeln('Выход - ESC.'); writeln; while(true) do begin b:=input_hex; write(' '); portout(b); end; end;
procedure read_mass(infile :string; var mb: mass_of_byte; var size: integer); var f1: file; begin Assign(f1, infile); {$I-} Reset(f1,1); {$I+} if IOResult <> 0 then begin Writeln('Attempt to open input file failed.'); readln; Halt(1); end; size:=FileSize(f1); if(size > max_size) then begin Writeln(infile,' size=',size:5, ' more then max_size=',max_size); readln; Halt(1); end else begin BlockRead(f1,mb,size); Close(f1); Writeln('File "',infile,'" ',size:4,' bytes'); end; end;
procedure read_big_mass(infile :string; var mb: mass_of_byte; file_pos: longint; var count: word; var lsize: longint); var f1: file; result: word; begin Assign(f1, infile); {$I-} Reset(f1,1); {$I+} if IOResult <> 0 then begin Writeln('Attempt to open input file failed.'); readln; Halt(1); end; lsize:=FileSize(f1); Seek(f1,file_pos); BlockRead(f1,mb,count,result); count:=result; Close(f1); end;
function translate_byte(b: byte) : byte; var b1: byte; begin b1:=0; case (b And $F0) of $80: b1:=$3B; $C0: b1:=$7B; $90: b1:=$2B; $A0: b1:=$1B; $B0: b1:=$0B; $D0: b1:=$6B; $E0: b1:=$5B; $F0: b1:=$4B; $70: b1:=$CB; $60: b1:=$DB; $50: b1:=$EB; $40: b1:=$FB; $30: b1:=$8B; $20: b1:=$9B; $10: b1:=$AB; $00: b1:=$BB; end; b1:=b1 AND $F0; case (b And $0F) of $00: b1:=b1 Or $0B; $01: b1:=b1 Or $0C; $02: b1:=b1 Or $0D; $03: b1:=b1 Or $0E; $04: b1:=b1 Or $07; $05: b1:=b1 Or $08; $06: b1:=b1 Or $09; $07: b1:=b1 Or $0A; $08: b1:=b1 + $13; $09: b1:=b1 + $14; $0A: b1:=b1 + $15; $0B: b1:=b1 + $16; $0C: b1:=b1 Or $0F; $0D: b1:=b1 + $10; $0E: b1:=b1 + $11; $0F: b1:=b1 + $12; end; translate_byte:=b1; end;
function calculate_checksum(s: string) : byte; var s1: string; i: integer; b: byte; begin s1:=s; b:=0; if((s1[1]=#$06) And (s1[2]=#$89) And (Length(s1) > 3)) then begin for i:=3 to Length(s1) do begin b:=b XOR Ord(s1[i]); end; b:=b XOR $3C XOR $01; b:=translate_byte(b); end; calculate_checksum:=b; end;
procedure read_mem_gdfs(start_address, end_address: longint); var s: string; b: byte; begin s:=''; s:=#$06#$89#$32#$08#$00; s:=Concat(s,Chr((start_address AND $000000FF))); s:=Concat(s,Chr((start_address AND $0000FF00) SHR 8)); s:=Concat(s,Chr((start_address AND $00FF0000) SHR $10)); s:=Concat(s,Chr((start_address AND $FF000000) SHR $18)); s:=Concat(s,Chr((end_address AND $000000FF))); s:=Concat(s,Chr((end_address AND $0000FF00) SHR 8)); s:=Concat(s,Chr((end_address AND $00FF0000) SHR $10)); s:=Concat(s,Chr((end_address AND $FF000000) SHR $18)); (* b:=$C2; if((end_address - start_address) = $100) then b:=$B8; if((end_address - start_address) = $8) then b:=$C2; if((end_address - start_address) = $7) then b:=$BB; *) b:=calculate_checksum(s); s:=Concat(s,Chr(b)); (* write_hex_string(s); *) SendString(s); end;
procedure selection_tail_byte(start_address, end_address: longint); const bad_request=#$15#$06#$89#$FF#$01#$00#$02#$7C; var ch: char; s:string; b: byte; dummy: boolean; w: word; begin b:=$00; repeat write('b='); write_hex_byte(b); write(' '); (* read_mem_gdfs(start_address,end_address,b); *) my_delay(2); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(bad_request)); writeln; Inc(b); until (b = 0) Or (s <> bad_request); end;
procedure read_IMEI; var ch: char; s:string; dummy: boolean; w: word; begin SendString(#$06#$89#$0B#$14#$00#$89#$01#$01#$01#$00#$00#$02#$00#$FF#$00#$00); SendString(#$00#$00#$80#$00#$00#$04#$00#$00#$00#$6E); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= 1); writeln; (* Read IMEI *) SendString(#$89#$24#$00#$00#$B4); writeln('IMEI: '); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; if(Length(s) = 11) then write(''''); if(Length(s) = 25) then write(''' '); if((Length(s) > 10) And (Length(s) < 25)) then write(ch) else begin write_hex_byte(Ord(ch)); write(' '); end; end; until (Length(s) >= 25); writeln; end;
function write_current_time: longint; var Hour,Minute,Second,Sec100: word; l: longint; begin GetTime(Hour,Minute,Second,Sec100); l:=Hour; l:=l SHL $10; l:=l OR (Minute SHL $8) OR (Second And $FF); if(Hour < 10 ) then write('0'); write(Hour,':'); if(Minute < 10 ) then write('0'); write(Minute,':'); if(Second < 10 ) then write('0'); write(Second); writeln; write_current_time:=l; end;
procedure write_time_interval(begin_time, end_time: longint); var Hour_begin,Minute_begin,Second_begin,Hour_end,Minute_end,Second_end: word; time1_sec,time2_sec, interval: longint; Hour,Minute,Second: word; begin Hour_begin:=(begin_time AND $00FF0000) SHR $10; Minute_begin:=(begin_time AND $0000FF00) SHR $8; Second_begin:=begin_time AND $FF; time1_sec:=Second_begin + (Minute_begin * 60 ) + (Hour_begin * 60 * 60); Hour_end:=(end_time AND $00FF0000) SHR $10; Minute_end:=(end_time AND $0000FF00) SHR $8; Second_end:=end_time AND $FF; if((Hour_begin = 23) AND (Hour_end = 0)) then Hour_end:=25; time2_sec:=Second_end + (Minute_end * 60 ) + (Hour_end * 60 * 60); interval:=time2_sec - time1_sec; Hour:=trunc(interval/(60*60)); Dec(interval, (Hour * 60 * 60)); Minute:=trunc(interval/60); Dec(interval, (Minute * 60)); Second:=interval; write('interval telechargements= '); if(Hour <> 0 ) then write(Hour,':'); if(Minute < 10 ) then write('0'); write(Minute,':'); if(Second < 10 ) then write('0'); write(Second); writeln; end;
procedure write_pointer_param(p: pointer); begin write_hex_word(Seg(p^)); write(':');write_hex_word(Ofs(p^));writeln; end;
procedure write_mass(p: pointer; count: word; add_to_file: boolean); const BlockSize=2048; var f1: file; i: integer; outfile: string[68]; begin outfile:='a.bin'; Assign(f1, outfile); if(not add_to_file) then ReWrite(f1,BlockSize) else begin Reset(f1,BlockSize); Seek(f1,FileSize(f1)); end; BlockWrite(f1,p^,trunc(count/BlockSize)); Close(f1); end;
procedure main; const first_response='Z'; second_response=#$80#$00#$03#$01#$FF#$FF#$FF#$FF; third_response=#$45#$73#$42; fourth_response=#$45#$68#$4D; fifth_response=#$45#$61#$54#$45#$62#$53; six_response=#$45#$64#$51; seven_response=#$89#$08#$30#$00+'041008 0857 LLECXC1326738_COMPACTFLASHLOADER R2M'+#$CC; bad_request=#$15#$06#$89#$FF#$01#$00#$02#$7C; MaxY=37; flash_begin_address=$44000000; flash_end_address= $44100000 - 1; time_out=36; m1: word=10*2048; num_pointers=4; packet_length_max=$200; header_tail_length=12; type BytePoint=^byte; var ch: char; (* ђ Ў®з п ЇҐаҐ¬Ґ п *) i,j,size: integer; s:string; b: byte; mb:mass_of_byte; dummy, good_response, hex_output,debug: boolean; w,count,packet_length,i1: word; lsize,file_pos: longint; k,code,np: integer; checksum_recived,checksum_calculated: byte; flash_current_address,my_sys_timer,begin_time,end_time: longint; ap: array[1..num_pointers] of pointer; my_avail_mem,big_array_index: longint; file_exist, tmp_bool: boolean;
function AddrByte(p: pointer;i: word): BytePoint; begin AddrByte:=Ptr(Seg(p^),Ofs(p^)+(i-1)); end;
function GetByte(p: pointer;i: word): Byte; begin GetByte:=AddrByte(p,i)^; end;
procedure PutByte(p: pointer;i: word; b: byte); begin AddrByte(p,i)^:=b; end;
procedure BigArray_AddrByte(l: longint; var num_pointer_in_array: integer; var w: word); begin num_pointer_in_array:=1 + trunc((l-1)/max_size1); w:=l - (num_pointer_in_array - 1) * max_size1; end;
function BigArray_GetByte(l: longint): word; var num_pointer_in_array: integer; w: word; begin if(l > my_avail_mem) then BigArray_GetByte:=$FF00 else begin BigArray_AddrByte(l,num_pointer_in_array,w); BigArray_GetByte:=$0000 OR GetByte(ap[num_pointer_in_array],w); end; end;
function BigArray_PutByte(l: longint; b: byte): boolean; var num_pointer_in_array: integer; w: word; begin if(l > my_avail_mem) then BigArray_PutByte:=false else begin BigArray_PutByte:=true; BigArray_AddrByte(l,num_pointer_in_array,w); PutByte(ap[num_pointer_in_array],w,b); end; end;
begin ClrScr; if(flash_end_address <= flash_begin_address) then begin writeln('Bad flash_begin_address or flash_end_address.'); exit; end; debug:=false; for i:=1 to BSIZE do buf[i]:=Chr(0); for i:=1 to max_size do mb[i]:=0; init_com_port; writeln('procedure SonyEricsson K500/K700 Flash Loader terminal.'); writeln('Выход - ESC.'); good_response:=false; s:=''; my_delay(1); repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin writeln(ch); if(ch <> first_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good response from phone !'); exit; end else good_response:=true; end; until good_response OR KeyPressed; if(good_response) then begin writeln('Good response from phone !'); portout($3F); my_delay(2); repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(second_response)); if(s <> second_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good second response from phone !'); exit; end else begin writeln; writeln('Good second response from phone !'); end; portout($53); portout($34); my_delay(2); setparm(115200,'N',8,1); my_delay(1); SendString('QH00'); my_delay(1); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(third_response)); write(' ',s); if(s <> third_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good third response from phone !'); exit; end else begin writeln; writeln('Good third response from phone !'); end; my_delay(1); read_mass('boot11.bin',mb, size); for i:=1 to size do portout(mb[i]); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(fourth_response)); write(' ',s); if(s <> fourth_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good fourth response from phone !'); exit; end else begin writeln; writeln('Good fourth response from phone !'); end; SendString('QA00'); count:=max_size; file_pos:=0; repeat read_big_mass('boot31.bin',mb,file_pos,count,lsize); for i:=1 to count do begin portout(mb[i]); end; Inc(file_pos,count); if((lsize - file_pos) >= max_size) then count:=max_size else count:=lsize - file_pos; until (file_pos >= lsize); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(fifth_response)); write(' ',s); if(s <> fifth_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good fifth response from phone !'); exit; end else begin writeln; writeln('Good fifth response from phone !'); end; SendString('QD00'); write('Loading big boot '); j:=0; count:=max_size; file_pos:=0; repeat read_big_mass('boot41.bin',mb,file_pos,count,lsize); for i:=1 to count do begin portout(mb[i]); Inc(j); if(j > 5000) then begin j:=0; write('.'); end; end; Inc(file_pos,count); if((lsize - file_pos) >= max_size) then count:=max_size else count:=lsize - file_pos; until (file_pos >= lsize); writeln; writeln('File boot41.bin ', lsize, ' bytes loaded to phone.'); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= Length(six_response)); write(' ',s); if(s <> six_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good fifth response from phone !'); exit; end else begin writeln; writeln('Good six response from phone !'); end; (* Read version bootloader from phone. *) writeln('Version: '); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; if(Length(s) = Pos('041008',seven_response)) then write(''''); if(Length(s) = Length(seven_response)) then write(''' '); if((Length(s) > Pos('041008',seven_response)-1) And (Length(s) < Length(seven_response))) then write(ch) else begin write_hex_byte(Ord(ch)); write(' '); end; end; until (Length(s) >= Length(seven_response)); if(s <> seven_response) then begin good_response:=false; portoff(comm_port); writeln; writeln('Not good seven response from phone !'); exit; end else begin writeln; writeln('Good seven response from phone !'); end; my_delay(2); writeln('FlashID: '); SendString(#$06#$89#$0D#$00#$00#$8B); s:=''; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin s:=s+ch; write_hex_byte(Ord(ch)); write(' '); end; until (Length(s) >= 8); writeln; read_IMEI; (* SendString(#$06#$89#$32#$08#$00#$C0#$FF#$F1#$44#$C8#$FF#$F1#$44#$C2); *) (* selection_tail_byte($50000002,$50000003); *) (* SendString(#$06#$89#$11#$00#$00#$9F); *) (* read_mem_gdfs($44000080,$44000100);*) debug:=false; write('HeapOrg='); write_pointer_param(HeapOrg); write('HeapEnd='); write_pointer_param(HeapEnd); my_avail_mem:=0; for i1:=1 to num_pointers-1 do begin GetMem(ap[i1],max_size1); write('ap[',i1,']: '); write_pointer_param(ap[i1]); Inc(my_avail_mem, max_size1); end; GetMem(ap[num_pointers],m1); write('ap[',num_pointers,']: '); write_pointer_param(ap[num_pointers]); Inc(my_avail_mem, m1); writeln('My available memory = ',trunc(my_avail_mem/1024),'K'); big_array_index:=1; file_exist:=false; write('Begin_telechargement '); begin_time:=write_current_time; my_delay(1); flash_current_address:=flash_begin_address; packet_length:=packet_length_max; repeat read_mem_gdfs(flash_current_address,flash_current_address + packet_length); i:=1; my_sys_timer:=sys_timer; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin mb[i]:=Ord(ch); { write_hex_byte(Ord(ch)); write(' '); } Inc(i); end; until ((i > (packet_length + 1 + header_tail_length)) OR (sys_timer > (my_sys_timer + time_out))); checksum_recived:=mb[i-1]; checksum_calculated:=$00; if((mb[1]=$06) And (mb[2]=$89)) then begin for j:=3 to i-2 do checksum_calculated:=checksum_calculated XOR mb[j]; checksum_calculated:=checksum_calculated XOR $3C XOR $01; checksum_calculated:=translate_byte(checksum_calculated); end; if(checksum_recived <> checksum_calculated) then begin writeln; writeln('Error: bad packet checksum.'); portoff(comm_port); FreeMem(ap[num_pointers],m1); for i1:= (num_pointers-1) downto 1 do FreeMem(ap[i1],max_size1); write('checksum_calculated='); write_hex_byte(checksum_calculated); writeln('h'); write('checksum_recived='); write_hex_byte(checksum_recived); writeln('h'); monitor(mb,$40,0); exit; end; Inc(flash_current_address,packet_length + 1); if(debug) then begin writeln; writeln; write_hex_longint(flash_current_address); writeln; writeln; end; GotoXY(1,MaxY); writeln('flash_current_address='); GotoXY(23,MaxY); write_hex_longint(flash_current_address); for k:=header_tail_length to i-2 do begin if(not BigArray_PutByte(big_array_index,mb[k])) then begin for i1:=1 to num_pointers-1 do begin write_mass(ap[i1],max_size1,file_exist); file_exist:=true; end; write_mass(ap[num_pointers],m1,true); big_array_index:=1; tmp_bool:=BigArray_PutByte(big_array_index,mb[k]); end; Inc(big_array_index); end; if((flash_current_address + packet_length_max) > flash_end_address) then packet_length:=flash_end_address - flash_current_address; until KeyPressed OR (flash_current_address >= flash_end_address); writeln; write('big_array_index='); write_hex_longint(big_array_index); BigArray_AddrByte(big_array_index,np, w); write(' np=',np,' w='); write_hex_word(w); writeln; (* Write to file tail of data in big array buffer *) if(np > 1) then for i1:=1 to np-1 do write_mass(ap[i1],max_size1,true); write_mass(ap[np],w,true); write('End_telechargement '); FreeMem(ap[num_pointers],m1); for i1:= (num_pointers-1) downto 1 do FreeMem(ap[i1],max_size1); end_time:=write_current_time; write_time_interval(begin_time,end_time); portoff(comm_port); writeln; writeln; monitor(mb,i-1,0); readln; end; { hex_output:=not false; repeat w:=portin; ch:=Chr(w And $00FF); if((w SHR 8) = 0) then dummy:=false else dummy:=true; if(not dummy) then begin if(not hex_output) then write(ch) else begin write_hex_byte(Ord(ch)); write(' '); end; end; until KeyPressed; end; portoff(comm_port); ch:=ReadKey; if(ch = Chr(ESC)) then begin writeln; writeln('Good bye!'); exit; end; writeln; writeln; readln; } end;
begin main; end.
|
Ресурс исходника: http://www.gsmericsson.narod.ru/К сожаление, мне что-то никак не удается приконектить даже рабочий телефон. Жду советов.
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
|