Wellcome to Electronics Design
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.


vanhiep89c51@yahoo.com Or vanhiep89c51@gmail.com
 
Trang ChínhTìm kiếmLatest imagesĐăng kýĐăng Nhập

 

 Hướng dẫn Viết Patch cho SL45....

Go down 
Tác giảThông điệp
pth1008

pth1008


Tổng số bài gửi : 13
Join date : 04/10/2008
Age : 115
Đến từ : co^?mo^.

Hướng dẫn Viết Patch cho SL45.... Empty
Bài gửiTiêu đề: Hướng dẫn Viết Patch cho SL45....   Hướng dẫn Viết Patch cho SL45.... I_icon_minitimeThu Oct 30, 2008 1:08 am

Hướng dẫn Viết Patch cho SL45 ....

Đầu tiên mọi người nên hiểu về cách thức patch, các patch cho SL sửa các lệnh thực thi trong firmware tại một vị trí nào đó để trỏ đến patch của ta, thực hiện xong rồi quay lại thực hiện tiếp các lệnh tiếp theo. Việc tìm đúng vị trí này quả thực rất khó, cần có kiến thức về vi điều khiển, debug... nên các patch chủ yếu mình dựa vào các patch có sãn rồi sửa lại theo ý mình.

Datasheet IC của Infineon sử dụng trong SL:
http://www.keil.com/dd/docs/datashts...on/c166ism.pdf
Mọi người đọc qua để tìm hiểu về các tập lệnh. Các lệnh hay dùng là MOV, CMP, JMPR/JMPS, CALL...

ASM và DIS-ASM
Các patch chủ yếu được viết bằng ngôn ngữ Assembler, thích C thì cần một cái Compiler hỗ trợ chíp trên (ko biết cái nào).

Với ASM, có 1 công cụ tuyệt vời của (master!) RizaPN sfe: Siemens Flash Explorer. Đọc file help của nó để biết cách sử dụng.
Biên dịch:
Code:
sfe a src.asm
sfe a src.asm p v56.bin > mypatch.vkp
v56.bin là firmware gốc của v56 (hoặc firm bạn đang dùng), lệnh thứ 2 sẽ tạo 1 file VKP, với đủ dữ liệu cũ trên firmware và dữ liệu mới cập nhật theo địa chỉ.
ví dụ:
Code:
0x3BA188: 46F13E00 FAE0307C
Khi disasm một patch, lưu ý là nên copy toàn bộ patch vào một dòng
Ví dụ với patch Functions of Side keys (+/-) in SMS editor
Code:
0x3A7BDC: 46FE2F00 FABF6070

0x1F7030: FFFF 46FE
0x1F7032: FF 0D ;"-" key
0x1F7033: FFFFFFFFFFFFFFFFFFFFFFFFFF 002D0446FE2F00FADAE07BE6FC
0x1F7040: FFFFFFFFFFFFFFFFFFFFFF E835E6FD0E00E6FEB400E0
0x1F704b: FF 5F ;5F:save SMS, 3F:send immediately
0x1F704C: FFFFFFFF DAC188AB
0x1F7050: FFFFFFFF FADA507C

0x1F7060: FFFF 46FE
0x1F7062: FF 0e ;"+"key
0x1F7063: FFFFFFFFFFFFFFFFFFFFFFFFFF 002D04FABF3070FADAE07BE6FC
0x1F7070: FFFFFFFFFFFFFFFFFFFFFF E835E6FD0E00E6FEB400E0
0x1F707b: FF 3F ;3F:send immediately (or 4F), 5F:save SMS
0x1F707c: FFFFFFFF DAC188AB
0x1F7080: FFFFFFFF FADA507C
thì ta chỉ copy chuỗi từ 46FF...507C, kô có phần byte cũ (FF..FF) rồi disasm chuỗi đó. Do patch này có 2 phần nên ta sẽ chia làm 2
Code:
> sfe d 46FE0D002D0446FE2F00FADAE07BE6FCE835E6FD0E00E6FEB400E05FDAC188ABFADA507C

000000: 46 FE 0D 00 : cmp r14, #0Dh
000004: 2D 04 : jmpr cc_Z, loc_00000E
000006: 46 FE 2F 00 : cmp r14, #2Fh
00000A: FA DA E0 7B : jmps 0DAh, loc_DA7BE0
;------------------------------------------------------------
00000E: E6 FC E8 35 : loc_00000E:
00000E: E6 FC E8 35 : mov r12, #35E8h
000012: E6 FD 0E 00 : mov r13, #0Eh
000016: E6 FE B4 00 : mov r14, #0B4h
00001A: E0 5F : mov r15, #5
00001C: DA C1 88 AB : calls 0C1h, loc_C1AB88
000020: FA DA 50 7C : jmps 0DAh, loc_DA7C50
;------------------------------------------------------------

> sfe d 46FE0e002D04FABF3070FADAE07BE6FCE835E6FD0E00E6FEB400E03FDAC188ABFADA507C

000000: 46 FE 0E 00 : cmp r14, #0Eh
000004: 2D 04 : jmpr cc_Z, loc_00000E
000006: FA BF 30 70 : jmps 0BFh, loc_BF7030
;------------------------------------------------------------
00000A: FA DA E0 7B : jmps 0DAh, loc_DA7BE0
;------------------------------------------------------------
00000E: E6 FC E8 35 : loc_00000E:
00000E: E6 FC E8 35 : mov r12, #35E8h
000012: E6 FD 0E 00 : mov r13, #0Eh
000016: E6 FE B4 00 : mov r14, #0B4h
00001A: E0 3F : mov r15, #3
00001C: DA C1 88 AB : calls 0C1h, loc_C1AB88
000020: FA DA 50 7C : jmps 0DAh, loc_DA7C50
;------------------------------------------------------------

Ta tìm hiểu chút về patch này. Ban đầu nó sửa:
Code:
46 FE 2F 00 : cmp r14, #2Fh
thành
FA BF 60 70 : jmps 0BFh, loc_BF7060
Tức là thay vì dùng lệnh so sánh thanh ghi R14 với 2Fh, nó sẽ nhảy tới địa chỉ BF7060.
Chính là địa chỉ 0x1F7060: FFFF 46FE. Trong firmware code thực hiện từ địa chỉ gốc 0A00000h nên BF7060 là 1F7060 khi patch vào firm, tương tự C, D, E tương ứng với 2, 3, 4... Và chú ý là có sự đảo byte của địa chỉ khi được disasm so với mã hexa trong firm FABF6070 (FA là jmps)
Khi disasm bằng SFE, nó đề địa chỉ từ 000000 vì ta chưa khai báo base address cho nó (xem trong help)
Tiếp tục, đọc patch ta tự hiểu r14 đang chứa giá trị của phím SL được nhấn. OE là "+", OD là "-"
Nếu bằng sẽ nhảy tới loc_00000E (jmpr là nhảy tới vị trí tương đối so với vị trí hiện tại).
Tại chỗ này, các lệnh mov sẽ đưa vào thanh ghi những giá trị thích hợp (!) rồi gọi chương trình con ở C1AB88, chạy xong sẽ nhảy lại vị trí đầu khi ta patch, DA7C50 tức 3A7C50. Còn hỏi tại sao lại là những giá trị và địa chỉ đó thì mình chịu, phải xem và hiểu phần code gốc của SL.
Còn không bằng sẽ tiếp nhảy tới loc_BF7030, tức là phần trên của patch, phần patch này lại so sánh với 0Dh, nếu không bằng sẽ so sánh tiếp với #2Fh (lệnh mà ta đã sửa để nhảy tới patch của ta) sau đó nhảy về...
Viết 1 patch cho SL
Ta sẽ viết lại patch Side key trên để thêm chức năng cho nó
Code:
#define SMS_func 0C1AA30h ; Định nghĩa hàm (có từ patch ban đầu)

base 0A00000h ; Khai báo địa chỉ đầu

org 0DA7BDCh ; Địa chỉ để patch, cho nhảy tới label sidemain
jmps sidemain

org 0E0C6E0h ; 1 Địa chỉ trống trong firm
sidemain:
cmp r14, #62h ; Phím Play
jmpr cc_Z, sidekey_1
cmp r14, #0Dh ; Phím [-]
jmpr cc_Z, sidekey_2
cmp r14, #0Eh ; Phím [+]
jmpr cc_Z, sidekey_3
cmp r14, #8 ; Phím Record
jmpr cc_Z, sidekey_4
cmp r14, #2Fh ; Không có những phím nào như trên được nhấn
jmps 0DA7BE0h

sidekey_1: ; Play: gửi sms (có từ patch ban đầu)
mov r12, #35E8h
mov r13, #0Eh
mov r14, #0B4h
mov r15, #3
calls SMS_func
jmps 0DA7C50h

sidekey_2: ;[-] -> chưa sử dụng (đang comment)
; calls xxxxxxxx
jmps 0DA7C50h

sidekey_3: ;[+] -> chưa sử dụng (đang comment)
; calls xxxxxxxx
jmps 0DA7C50h

sidekey_4: ;Record: nhớ sms
mov r12, #35E8h
mov r13, #0Eh
mov r14, #0B4h
mov r15, #5
calls SMS_func
jmps 0DA7C50h
Với lệnh ở sidekey_2, mình chưa sử dụng, ở đây ta sẽ calls một ch trinh con. Ví dụ để chuyển đảo trạng tái của đèn, ta thấy ở bảng sau là entrypoint DADC8046
DA chính là CALLS, do vậy hàm ta cần ở đây là
Code:
calls 0DC4680h
Tuy nhiên không phải hàm nào cũng sử dụng được, rất nhiều cái bị conflict làm tắt máy.
Để tìm địa chỉ trống trong firm, ta dùng
Code:
> sfe 0 56.bin

0x1B0120: free 0x041268 bytes
...
0x1B0120 tức 0BB0120h. Hoặc dùng địa chỉ của patch cũ.

Xong, compile và test
Code:
sfe a sidekey.asm p 56.bin > sidekey.vkp
Một số entrypoint:
Quote:
DAD8B4E1 Java
DAD8B8E1 Internet
DAD8C4E1 Grajek MP3
DAD8CAE1 Karta MMC
DAD8CEE1 Chronometer
DAD8D6E1 Currency
DAD8DAE1 Gry
DADB3CEF Ks. Adresowa na MMC
DADB46EF Ks. Adresowa na SIM
DADB50EF Kalendarz
DADB5CEF Przypomnienia
DADB68EF Dyktafon
DADB6CEF Answer-Message
DADB70EF BussinessCard
DADB7CEF Kalkulator
DADB80EF VoiceControl
DADB80F2 Call-Missed
DADB84F2 Call-Received
DADB88F2 Call-Dialed
DADB8CF2 Alarm-Missed
DADC1606 Compose-Melody
DADC0479 Gra-SuperMind
DADC1079 Gra-MoveTheBox
DADC1479 Gra-Wacko
DADC0879 Gra-HomeRun
DADCFC78 Gra-Reversi
DADC0079 Gra-Quattropoli
DADC0C79 Gra-TheMaze
DAD9620A Pisz nowego SMS'a
DAD9EE0A Skrzynka Odbiorcza
DAD9F80A Skrzynka Nadawcza
DAD9020B Archiwum
DADC1242 Kontast
DAD55AF2 Jêzyk
DAD56AF2 Pod¶wietlenie
DAD582F2 T9-Jêzyk

DADBF886 - Mp3-player(autoplay)
DADC8046 - Illumination(toggle)
DAD414F3 - Dyktafon - Nagrywaj
DAE6F8A9 - Voice Dial
DADCE82B - AutoKeyLock(toggle)
DADA169E - GSM-900
DADA269E - GSM-1800
DADA069E - AutoBand
DADC5A52 - Erase Records(Menu/Setup/Status/...)
DADCE846 - IrDA (toggle)
DAA44A98 - Nie ma ¿adnego profilu ustawionego

DAC23A4F - w³±czanie telefonu
DAC24A4F - wy³±czanie telefonu

DAE8DC2B - Auto Keylock Setup/Device/Keyboard
DAC23A4F lub 6 znakowy C24F3A - restart telefonu

DAC00600 : Light on
DAC00E00 : Light off
Mã phím
Quote:
5C : UPPER LEFT
05 : GREEN
01 : RED
03 : UPPER RIGHT

22 : RIGHT ARROW
20 : DOWN ARROW
21 : UP ARROW
23 : LEFT ARROW

13 : *
14 : #
15 : DIGIT 0-9
1F : LONG #

0E : LEFT SIDE +
0D : LEFT SIDE -
62 : LEFT SIDE PLAY
SourceCode các patch của RizaPN:
http://www.geocities.com/rizapn/
http://www.orbitfiles.com/download/id2686258942.html
http://www.orbitfiles.com/download/id2686235268.html

Nên thảm khảo các bài viết trên http://www.gsmhosting.com/vbb/forumdisplay.php?f=341
Về Đầu Trang Go down
pth1008

pth1008


Tổng số bài gửi : 13
Join date : 04/10/2008
Age : 115
Đến từ : co^?mo^.

Hướng dẫn Viết Patch cho SL45.... Empty
Bài gửiTiêu đề: Re: Hướng dẫn Viết Patch cho SL45....   Hướng dẫn Viết Patch cho SL45.... I_icon_minitimeThu Oct 30, 2008 1:10 am

Tạo selectable cho 1 patch
Cần có patch APP. Application Menu v3a Corrected

Ví dụ patch:
Code:
;*** NSM. No Softkeys on Mainscreen v0.4 *** (c) Seklth, abomin
0x20E018: DAC14C4A DAC7D0D2
0x27D2D0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D7503400F3F41B3E3D02DAC14C4ADB00

;Add: show buttons in dictafone etc
;Unistall MBT.Menu Button Text

0x20E424: DAE6F854 DAC760E9
0x27E960: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E7F4000046FCA0013D02E7F41000D740
0x27E970: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 3400F7F41B3EFAE6F854FFFFFFFFFFFF

;Small Pictures
20DD17: 02 05
20E04C: F2FD0EFE E6FD0000
20E034: EA90DEE0 CC00CC00

;Pictures 8x11
(...)
Vì patch này patch nhiều địa chỉ, nên ta chỉ lấy ví dụ với phần đầu của patch:
Code:
>sfe d D7503400F3F41B3E3D02DAC14C4ADB00 27D2D0

27D2D0: D7 50 34 00 : extp #34h, #2
27D2D4: F3 F4 1B 3E : movb rl2, mem_D3E1B ; (0034:3E1B)
27D2D8: 3D 02 : jmpr cc_NZ, loc_27D2DE
27D2DA: DA C1 4C 4A : calls 0C1h, loc_C14A4C
27D2DE: DB 00 : loc_27D2DE:
27D2DE: DB 00 : rets
;------------------------------------------------------------
Ta bổ sung và sửa lại đoạn địa chỉ 0x27D2D0 như sau:
Code:
base 0A00000h

org 0C7D2D0h ;0x27D2D0 ; Địa chỉ patch

mov [-r0], r12 ; Backup r12, có thể dùng thanh ghi khác
extp #0Eh, #1 ; (000E:3A42): Profile1.
mov r12, 3A42h ; Có thể dùng Profile2: thay #OEh bằng #36h, 34A2h bằng 096Ch
; Profile3: 36/096E
jb r12.1, patch_start ; 1 là STT function (từ 0). Ở đây là Function 2
; thay jb bằng jnb nếu muốn thực hiện khi Function không đc chọn
; (Hoặc có thể ngược lại, lâu quên mất)
mov r12, [r0+] ; Trả giá trị r12 về giá trị ban đầu
jmpr cc_UC, patch_end ; Nhảy không điều kiện
; Do patch ban đầu kết thúc là rets, có thể thay dùng rets luôn ở đây
; (Một số patch phải dùng Jmps nhưng đa số các patch đều là rets vì ban đầu dùng DA (calls))

patch_start: ; Patch ban đầu
mov r12, [r0+] ; Thêm: Trả giá trị r12 về giá trị ban đầu
; Trong patch gốc nó ghi đè lên r12 nên ta có thể không cần dòng này.
extp #34h, #2
movb rl2, 3E1Bh ; (0034:3E1B)
jmpr cc_NZ, patch_end ; Địa chỉ tương đối (Địa chỉ kết thúc của Patch ban đầu)
calls 0C14A4Ch ; Địa chỉ tuyệt đối
patch_end:
rets
Compile rồi so sánh với patch đầu
Code:
88C0D7400E00F2FC423A8AFC021098C00D0898C0D7503400F3F41B3E3D02DAC14C4ADB00
patch ban đầu: D7503400F3F41B3E3D02DAC14C4ADB00
Phần sau tương tự, nhưng nhớ bỏ phần FFFFF... khi disasm (E7F40...6F854)

Trên đây chỉ là cách áp dụng cho những patch đơn giản, với những patch phức tạp và dài, ta sửa dòng jmpr cc_UC, patch_end thành rets, compile và chú ý phần được thêm vào
Code:
88C0D7400E00F2FC423A8AFC021098C0DB0098C0
Để ý: 0E 423A 8A và 1
0E: profile1 (profile2,3 là 36)
423A: profile1 (profile2: 6C09 profile3: 6E09)
8A: checked (9A - unchecked)
1: STT (0-F tương ứng Function 1 - 16)

Như vậy ta chỉ cần thêm đoạn trên vào patch ban đầu, sửa chút địa chỉ trong file VKP cho phù hợp khi thêm chuỗi trên (vì patch theo địa chỉ, nên ta phải tịnh tiến patch cũ lên bằng độ dài phần thêm vào). Phải nhắc lại là cách này không áp dụng cho tất cả các patch.
Base of xxx patches
Patch này tạo cho ta những slot để có thể thêm vào phần gọi tới patch của ta
Code:
;***Base of mainscreen patches***
0x3B3A1E: 46F8FFFF DAE090DB

40DB90: FFFFFFFF DAE020CC ;Switch battery in percent/voltage
40DB94: FFFFFFFF DAC790D6 ;Profile Logo
40DB98: FFFFFFFF CC00CC00 ; Đặt địa chỉ patch tại đây
40DB9C: FFFFFFFF CC00CC00 ;(ví dụ như 2 cái trên hoặc thêm mấy cái indicator nữa
40DBA0: FFFFFFFF CC00CC00
40DBA4: FFFFFFFF CC00CC00
40DBA8: FFFFFFFF CC00CC00
40DBAC: FFFFFFFF 46F8FFFF ; cần thiết trc khi trở về
40DBB0: FFFF DB00 ; return
Hiện tại có Base of mainscreen patches và Base of mp3 patches.


Nếu ai đã đọc file sl45.inc của RizaPN, sẽ thấy rất nhiều hàm cũng như những địa chỉ rất hay trong bộ nhớ (như thông tin về nhiệt độ, volt pin, thời gian)
Tuy nhiên để có thể khai thác hết được đối với mình rất khó, chỉ sử dụng được một số nhỏ trong đó, tiêu biểu là hàm hiện ảnh, hàm hiện chữ và vẽ hình cn
Về Đầu Trang Go down
pth1008

pth1008


Tổng số bài gửi : 13
Join date : 04/10/2008
Age : 115
Đến từ : co^?mo^.

Hướng dẫn Viết Patch cho SL45.... Empty
Bài gửiTiêu đề: Re: Hướng dẫn Viết Patch cho SL45....   Hướng dẫn Viết Patch cho SL45.... I_icon_minitimeThu Oct 30, 2008 1:11 am

DrawImageIdx
Hàm có tác dụng hiện 1 ảnh trong firm (như khi sử dụng SPC, với giá trị index ảnh, tọa độ X, tọa độ Y là đầu vào)
Code:
#define drawImgIdx 0C122ECh
Để biết cách sử dụng, ta xem ví dụ patch Battery in percent
Code:
40CACE: 88 70 : mov [-r0], r7 ; Lưu lại giá trị r7
40CAD0: D7 40 0E 00 : extp #0Eh, #1 ; Trỏ tới vùng nhớ
40CAD4: F2 F7 E2 39 : mov r7, 3B9E2h ; Lấy giá trị tại địa chỉ wBattVoltage (0Eh:39E2h) cho vào r7
40CAD8: E6 FD 10 0E : mov r13, #0E10h ; r13 = 3600 (0E10h = 3600d) (thiết lập giá trị nhỏ nhất mV)
40CADC: 20 7D : sub r7, r13 ; r7 - r13
40CADE: 9D 03 : jmpr cc_NC, loc_40CAE6 ; nhảy tới 40CAE6 nếu không có cờ nhớ (tức r7 > r13)

40CAE0: E6 FE 01 02 : mov r14, #201h ; r14 = index ảnh đầu tiên (ảnh số 0)
40CAE4: 0D 28 : jmpr cc_UC, loc_40CB36 ; nhảy tới 40CB36 (chỉ vẽ từ số hàng đơn vị)
;------------------------------------------------------------
40CAE6: E6 FC 3F 02 : loc_40CAE6:
40CAE6: E6 FC 3F 02 : mov r12, #23Fh ; r12 = 575 (đây là khoảng giá trị giữa Max và Min. 3600 + 575 = 4175 mV)
40CAEA: E6 FD 64 00 : mov r13, #64h ; r13 = 100
40CAEE: 1B 7D : mulu r7, r13 ; r7 * 100
40CAF0: 5B CC : divu r12 ; / 575
40CAF2: F2 F7 0E FE : mov r7, mem_FE0E ; 0FE0Eh chính là byte MDL (byte thấp lưu kết quả phép tính)
40CAF6: 46 F7 64 00 : cmp r7, #64h ; So sánh với 100
40CAFA: 8D 0A : jmpr cc_C, loc_40CB10 ; nhảy nếu nhỏ hơn (chỉ vẽ từ hàng chục)

40CAFC: 26 F7 64 00 : sub r7, #64h ; Trừ 100
40CB00: E6 FE 02 02 : mov r14, #202h ; *** r14 lưu giá trị Index ảnh (#514) ***
40CB04: E6 FC 4B 00 : mov r12, #4Bh ; *** r12 là tọa độ X (75 / 101) ***
40CB08: E6 FD 00 00 : mov r13, #0 ; *** r13: tọa độ Y (0 / 80) ***
40CB0C: DA C1 EC 22 : calls 0C1h, loc_C122EC ; *** Thực hiện vẽ ảnh DrawImageIdx #514 (1 - số hàng trăm) ***

40CB10: E0 0E : loc_40CB10:
40CB10: E0 0E : mov r14, #0 ; Tiếp tục vẽ hàng chục
40CB12: 26 F7 0A 00 : loc_40CB12:
40CB12: 26 F7 0A 00 : sub r7, #0Ah ; r7 -= 10
40CB16: 8D 02 : jmpr cc_C, loc_40CB1C ; Nếu phép trừ nhỏ hơn 0 thì nhảy tới 40CB1C
40CB18: 08 E1 : add r14, #1 ; r14++
40CB1A: 0D FB : jmpr cc_UC, loc_40CB12 ; quay lại cho đến khi r14 bằng số hàng chục (chẳng hiểu sao tác giả dùng cách này)
;------------------------------------------------------------
40CB1C: 06 F7 0A 00 : loc_40CB1C:
40CB1C: 06 F7 0A 00 : add r7, #0Ah ; r7 += 10

40CB20: 06 FE 01 02 : add r14, #201h ; r14 cộng với #201h ra index ảnh tương ứng
40CB24: E6 FC 51 00 : mov r12, #51h
40CB28: E6 FD 00 00 : mov r13, #0
40CB2C: DA C1 EC 22 : calls 0C1h, loc_C122EC ; Vẽ số hàng chục

40CB30: E6 FE 01 02 : mov r14, #201h ; r14 = #201h
40CB34: 00 E7 : add r14, r7 ; r14 += r7
40CB36: E6 FC 57 00 : loc_40CB36:
40CB36: E6 FC 57 00 : mov r12, #57h
40CB3A: E6 FD 00 00 : mov r13, #0
40CB3E: DA C1 EC 22 : calls 0C1h, loc_C122EC ; Vẽ số hàng đơn vị

40CB42: E6 FE 45 01 : mov r14, #145h
40CB46: E6 FC 5D 00 : mov r12, #5Dh
40CB4A: E6 FD 00 00 : mov r13, #0
40CB4E: DA C1 EC 22 : calls 0C1h, loc_C122EC ; ảnh "%"

40CB52: 98 70 : mov r7, [r0+] ; Trả giá trị r7 về giá trị trc khi thực hiện patch
40CB54: DB 00 : rets ; return từ lệnh calls
;------------------------------------------------------------
Ngoài ra còn nhiều hàm nữa, các thread về SL45 trên GSM hosting (đặc biệt là Patching: Technical Discussion) thực sự rất có ích. Ngoài ra mọi người chịu khó disasm các patch, cố gắng hiểu nó làm gì và bắt chước, mình cũng mất rất nhiều thời gian, nhưng chẳng có ai có thể hỏi đc nên cũng kô biết làm cách nào khác (và thực sự mình chưa hiểu sâu đc, rất nhiều thứ phải bó tay). Nếu biết tiếng Trung có thể tham gia vào 1 số diễn đàn của bọn TQ, http://bbs.0110.cn thì phải, chẳng nhớ nữa. Bọn nó toàn làm về v55, nhưng cũng gần giống

Để hiểu thêm về firmware SL, vào trang http://mamaich.uni.cc/ tìm phần SL45 có cái file Disasm toàn bộ firm và một số chú thích (chỉ một số!) và một số file khác.
File fw5601.rar cởi nén rồi view bằng IDA 4.8 (bản 5.0 không đc) - Up mãi mới xong..
Nếu ai đã dùng Patch Battery in percent cùng với hình nền, chắc hẳn thấy cái ảnh của nó lấn vào phần nền (do chiều cao lớn)
Không biết đã ai nói chưa, nhưng cách khắc phục của mình là dùng SPC3 (hoặc Smelter), tìm đến cái ảnh đó, ta sẽ thấy địa chỉ PIT Address
Ví dụ #513 là 0x004BB4BE
Kích cỡ ảnh được lưu trong firm như sau:
4BB4BE: 0609 -> chiều rộng 6 và chiều cao 9 (chú ý đơn vị trên hệ hexa)
Như vậy ta có thể dùng VKlay chỉnh lại kích cỡ ảnh:
Code:
4BB4BE: 0609 0607 ; Đặt chiều rộng là 6, chiều cao là 7
Khi chỉnh lại kích cỡ thì ảnh cũng bị thay đổi, do đó lại dùng SPC để đổi lại ảnh (mình dùng VKlay up patch vào file firm trên ổ cứng, rồi load sửa cái đấy bằng SPC.
Như vậy với điện thoại chỉ cần up lần lượt patch có được vào máy)

dspMsgBox
Code:
#define dspMsgBoxV 0E6F138h
#define dspMsgBoxI 0E6F198h
Hàm có tác dụng hiện 1 thông báo có biểu tượng V hoặc I
Với dòng chữ hiển thị là Index trong language. Ví dụ patch Insert "Timbre"
Code:
mov r13, #3FDh ; "Bass"
mov r12, #1
calls dspMsgBoxV
showMsgIcon2
#define showMsgIcon2 0E5DDCEh
Hàm có chức năng hiển thị 1 bảng thông báo, xác nhận Yes/No, như trong patch Save and Exit from SMS Editor
Patch này đã được mình decompile viết lại với mục đích có thể compile và hiểu được cách dùng hàm này:
Code:
#define showMsgIcon2 0E5DDCEh
#define MsgFunc 0C1AA30h

base 0A00000h

org 0DA7C26h
jmps Main ;orig: cmp r1, #3Eh ;46F13E00

org 0C7E030h
Main:
cmp r12, #1
jmpr cc_NZ, NoRed
mov r12, #q(DlgData) ; offset of page value
mov r13, #p(DlgData) ; page value
mov r14, #q(DlgText)
mov r15, #p(DlgText) ; Có thể cho r15 = r13 để tiết kiệm 1byte
calls showMsgIcon2
jmps 0DA7C50h ; return

NoRed:
cmp r12, #5Ah
jmps 0DA7C2Ah ; return with no changes

DlgHandler:
mov r4, r14
cmp r14, #23h
jmpr cc_NZ, NotYes
mov r12, #35E8h ; YES
mov r13, #0Eh
mov r14, #0B4h
mov r15, #5 ; save (3 -> send)
calls MsgFunc
jmpr cc_UC, Quit

NotYes:
cmp r14, #24h
jmpr cc_NZ, NotNo

Quit:
mov r12, #35E8h ; NO
mov r13, #0Eh
mov r14, #0B4h
mov r15, #0Fh ; exit
calls MsgFunc

NotNo:
rets

DlgText:
dw 57Bh, 7FFFh ; #57Bh = "Save Message"
; 7FFFh là bắt buộc
DlgData:
dw 0, 0, 2, 0, 0, 7FFFh ; Để nguyên như vậy
dw 0, 0, o(DlgHandler), s(DlgHandler)
dw 0, 0, 2C5Ah, 2E2h, 4E26h, 2
Code phần DlgText có khác chút so với cách hướng dẫn trên GSMhosting (vì mình làm theo cách đấy không đc)
Patch này vẫn đang bị lỗi là chưa thoát được khỏi SMS nếu chọn YES, mình cũng đã thử rất nhiều cách khác nhau mà vẫn chưa đc, hi vọng ai đó fix giúp.
Về Đầu Trang Go down
Sponsored content





Hướng dẫn Viết Patch cho SL45.... Empty
Bài gửiTiêu đề: Re: Hướng dẫn Viết Patch cho SL45....   Hướng dẫn Viết Patch cho SL45.... I_icon_minitime

Về Đầu Trang Go down
 
Hướng dẫn Viết Patch cho SL45....
Về Đầu Trang 
Trang 1 trong tổng số 1 trang
 Similar topics
-
» Cáp SL45 cổng com

Permissions in this forum:Bạn không có quyền trả lời bài viết
Wellcome to Electronics Design :: Di Động :: Sơ Đồ :: Siemen-
Chuyển đến