Модераторы: Alexeis
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка сервисного ПО для Мобильных телефонов, read/write flash, info и тд 
:(
    Опции темы
SergXP
  Дата 3.3.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



Всем Добрый день!

Мой знакомый занимается ремонтом мобильных телефонов, ну и соответственно имеются программаторы для восстановления ПО.

В интернете есть программы, которые написаны в DELPHI, например http://papuas.allsiemens.com/Joker.htm

Это программа для Сименсов. 

У меня возникло несколько вопросов.

Возможно ли сделать программу для телефонов Sony Ericsson, которая могла бы уметь прошивать, читать инфу и тд?
Где можно почитать подобную информацию?

Как мне известно, в каждом моб. устройстве, стоит процессор, флешка. Как узнать, в какой области памяти лежит EEPROM например( или gdfs)?

Кто сталкивался с этим, поделитесь опытом  smile 

Мне удалось найти такой исходник(для 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/
PM MAIL WWW ICQ   Вверх
ishimcity
Дата 3.3.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: 1
Всего: 1



Мне кажеться это код на паскале.
Я на делфи писал програмку но пользоватся AT командами.
PM MAIL ICQ Skype YIM   Вверх
SergXP
Дата 3.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



ishimcity,  да, это код на паскале.
AT команды, если я не ошибаюсь, тут бессильны :(

Необходимо работать непосредственно с самими контролерами.

К сожалению мне не удается найти нужной инфы. 
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
ishimcity
Дата 4.3.2009, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 1.6.2007
Где: Тюменская область . Ишим

Репутация: 1
Всего: 1



Если с контроллером то думаю нужно обращаться на низком уровне к железке, на ассемблере например.
был замечательный сайт wasm.ru глянь может там что найдешь.
PM MAIL ICQ Skype YIM   Вверх
SergXP
Дата 5.3.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



ishimcity, да мне это известно, без низкого уровня тут никак не обойтись, вот где только можно узнать по какому адресу что находится в телефоне? В даташите я что-то не обнаружил. Может, это как-то подругому называется?
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
t_rex
Дата 5.3.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 1
Всего: 7



А что говорят люди на официальном форуме? У Sony-Ericsson есть же девелоперский портал. Может там спросить?
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
SergXP
Дата 8.3.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



Был на офф сайте, но что-то не нашел нужной инфы. Да и думаю, наврятли SE даст такую инфу. 
Хотя... может еще раз глянуть там.
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
SergXP
Дата 10.3.2009, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 16.4.2008

Репутация: нет
Всего: нет



ishimcity, спасибо за ресурс! Но только он мне пригодился для немнного другого дела!  smile 

Насчет соников, мне удалось узнать кое-какую инфу.
А именно как выполнить подключение к SE.
Если поразбираться с выше указанными кодом, то все сразу станет ясно.  smile 
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование мобильных устройств"
Alexeis

Раздел посвящен программированию мобильных устройств.

Все остальные вопросы по мобильным устройствам (КПК, смартфоны, телефоны, фотоаппараты и т.п),
не имеющие отношения к программированию, просьба размещать в разделе КПК, смартфоны, мобильники

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Платформы Windows Mobile и Windows Embedded | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.