Pages: (52) 1 2 3 .. 6 .. 9 .. 12 .. 15 .. 18 .. 21 .. 24 .. 27 .. 30 .. 33 .. 36 .. 39 .. 42 .. 45 .. 48 49 50 [51] 52  ( Show unread post )

> Модифицируем прошивку для DVD плейера (MTK 1389), инструкция от САХ
 Rvs Member is Offline
 Posted: 29-05-2007, 10:51 (post 751, #753250)

Member

Group: Members
Posts: 126
Warn:0%-----
vboroda

QUOTE
В общем, похоже что поиск "свободных ячеек" EEPROM осуществляется методом "научного тыка", или лучше сказать, наугад.
Я исходники этих функций не смотрел, но NA вышел из положения таким образом. В функции есть ограничение на максимально используемый адрес, он увеличивает границу на 20-30 байт тем самым он уверен на 100% что кроме него эти ячейки ни кто не тронет. Правда одно но, когда ещё не было исходнтков я попробовал увеличить границу, но у меня почему то не пошло, толи я не все изменения внёс толи что то ещё...

QUOTE
Сделал [пока, в тестовом варианте] так
Есть пару вопросов:
1. Как нашёл свободное место в Shared Mem?
2. Отобрази твою идею в исходнике, хочу тоже помозговать.
PM Email Poster
Top Bottom
 Andy007 Member is Offline
 Posted: 29-05-2007, 17:40 (post 752, #753310)

Newbie

Group: Members
Posts: 39
Warn:0%-----
Просто так увеличить это значение - этого мало:) Посмотри исходники вниманельнее - за границей максимального eeprom начинается зона сохранения положения на диске. Править надо далеко не в одном месте.
PM Email Poster
Top Bottom
 vboroda Member is Offline
 Posted: 29-05-2007, 21:48 (post 753, #753406)

Newbie

Group: Members
Posts: 21
Warn:0%-----
Итак,
(1) Где найти свободные ячейки SHMEM. Смотрим исходники. На каждую SI группу отводится 32 байта. В некоторых группах занято почти все, в других - частично.

Я решил воспользоваться местом в SI_TIME_INFO_GRP (в исходниках - номер 18, в моей прошивке - 19). После 23 там ничего не используется (хотя насчет ARM я на 100% не уверен, но 8032 явно требует только первые 23 ячейки). Значит, остается 9 свободных ячеек. Мне требовалось 5 байт - 3 для времени и 2 для item ID.

(2) Как работает? Нашел (по исходникам, и далее, следуя за дизассемблером) ф-ции, которые выполняются при нажатии определенных кнопок:
IR_PAUSE: fgISOPauseKey()
IR_STOP: fgISOStopKey()
IR_POWER: fgCOMPowerKey()
IR_NEXT: fgISONextKey()

Каждая из этих ф-ций вызывает vSendUopCmd() для передачи команды ARM. Значит, мы можем сделать один патч для первых трех ф-ций, который сохранит все требуемые данные. Что-то вроде этого:

CODE
B1:F960             saveThePlayTimePatch:                   ; CODE XREF: fgISOPauseKey+4Bp
B1:F960 90 FE 5D              mov   DPTR, #XRAM_FE5D        ; Save the original params
B1:F963 EF                    mov   A, R7
B1:F964 F0                    movx  @DPTR, A
B1:F965 A3                    inc   DPTR
B1:F966 ED                    mov   A, R5
B1:F967 F0                    movx  @DPTR, A
B1:F968 A3                    inc   DPTR
B1:F969 EB                    mov   A, R3
B1:F96A F0                    movx  @DPTR, A
B1:F96B 90 FC BF              mov   DPTR, #XRAM_FCBF        ; _bPlayType
B1:F96E E0                    movx  A, @DPTR                ; If not ISO Play, skip
B1:F96F B4 03 4F              cjne  A, #3, saveThePlayTimePatch_EXIT
B1:F96F
B1:F972 7F 06                 mov   R7, #6
B1:F974 12 1C 9E              lcall B1_fgFlCheckStatus      ; If not playing MPEG - skip
B1:F974
B1:F977 50 48                 jnc   saveThePlayTimePatch_EXIT
B1:F977
B1:F979
B1:F979             B1_F979:
B1:F979 7F 60                 mov   R7, #0x60 ; '`'
B1:F97B 7E 02                 mov   R6, #2
B1:F97D 12 1B 96              lcall B1_BS_ARM_GetChar
B1:F97D
B1:F980 EF                    mov   A, R7
B1:F981 FD                    mov   R5, A
B1:F982 7F 77                 mov   R7, #0x77 ; 'w'
B1:F984 7E 02                 mov   R6, #2
B1:F986 12 1B A8              lcall B1_BS_ARM_PutChar       ; Save hrs
B1:F986
B1:F989 7F 61                 mov   R7, #0x61 ; 'a'
B1:F98B 7E 02                 mov   R6, #2
B1:F98D 12 1B 96              lcall B1_BS_ARM_GetChar
B1:F98D
B1:F990 EF                    mov   A, R7
B1:F991 FD                    mov   R5, A
B1:F992 7F 78                 mov   R7, #0x78 ; 'x'
B1:F994 7E 02                 mov   R6, #2
B1:F996 12 1B A8              lcall B1_BS_ARM_PutChar       ; Save min
B1:F996
B1:F999 7F 62                 mov   R7, #0x62 ; 'b'
B1:F99B 7E 02                 mov   R6, #2
B1:F99D 12 1B 96              lcall B1_BS_ARM_GetChar
B1:F99D
B1:F9A0 EF                    mov   A, R7
B1:F9A1 FD                    mov   R5, A
B1:F9A2 7F 79                 mov   R7, #0x79 ; 'y'
B1:F9A4 7E 02                 mov   R6, #2
B1:F9A6 12 1B A8              lcall B1_BS_ARM_PutChar       ; Save sec
B1:F9A6
B1:F9A9 90 FD 62              mov   DPTR, #XRAM_FD62        ; _wCurrItem
B1:F9AC E0                    movx  A, @DPTR
B1:F9AD FD                    mov   R5, A
B1:F9AE 7F 7A                 mov   R7, #0x7A
B1:F9B0 7E 02                 mov   R6, #2
B1:F9B2 12 1B A8              lcall B1_BS_ARM_PutChar
B1:F9B2
B1:F9B5 90 FD 63              mov   DPTR, #(XRAM_FD62+1)    ; _wCurrItem
B1:F9B8 E0                    movx  A, @DPTR
B1:F9B9 FD                    mov   R5, A
B1:F9BA 7F 7B                 mov   R7, #0x7B
B1:F9BC 7E 02                 mov   R6, #2
B1:F9BE 12 1B A8              lcall B1_BS_ARM_PutChar
B1:F9BE
B1:F9C1
B1:F9C1             saveThePlayTimePatch_EXIT:              ; CODE XREF: saveThePlayTimePatch+Fj
B1:F9C1                                                     ; saveThePlayTimePatch+17j
B1:F9C1 90 FE 5D              mov   DPTR, #XRAM_FE5D        ; Call the function now
B1:F9C4 E0                    movx  A, @DPTR
B1:F9C5 FF                    mov   R7, A
B1:F9C6 A3                    inc   DPTR
B1:F9C7 E0                    movx  A, @DPTR
B1:F9C8 FD                    mov   R5, A
B1:F9C9 A3                    inc   DPTR
B1:F9CA E0                    movx  A, @DPTR
B1:F9CB FB                    mov   R3, A
B1:F9CC 12 1B 9C              lcall B1_vSendUopCmd
B1:F9CC
B1:F9CF 22                    ret
B1:F9CF
B1:F9CF             ; End of function saveThePlayTimePatch

И функция для восстановления (записываем вызов этой ф-ции в хэндлер IR_NEXT):

CODE
B1:F9D0             isoResumePatch:                         ; CODE XREF: fgISONextKey+9p
B1:F9D0 90 FE 5D              mov   DPTR, #XRAM_FE5D        ; Save the original params for vSendUopCmd
B1:F9D3 EF                    mov   A, R7
B1:F9D4 F0                    movx  @DPTR, A
B1:F9D5 A3                    inc   DPTR
B1:F9D6 ED                    mov   A, R5
B1:F9D7 F0                    movx  @DPTR, A
B1:F9D8 A3                    inc   DPTR
B1:F9D9 EB                    mov   A, R3
B1:F9DA F0                    movx  @DPTR, A
B1:F9DB 7F 77                 mov   R7, #0x77 ; 'w'
B1:F9DD 7E 02                 mov   R6, #2
B1:F9DF 12 1B 96              lcall B1_BS_ARM_GetChar       ; Get saved hrs
B1:F9DF
B1:F9E2 EF                    mov   A, R7
B1:F9E3 64 FF                 xrl   A, #0xFF                ; Check if not 0xFF
B1:F9E5 60 63                 jz    isoResumePatch_EXIT_J1
B1:F9E5
B1:F9E7 90 FE 60              mov   DPTR, #XRAM_FE60        ; Save hrs - first in BCD, then Binary
B1:F9EA EF                    mov   A, R7
B1:F9EB F0                    movx  @DPTR, A
B1:F9EC 12 1B 5A              lcall B1_bBCDToHEX
B1:F9EC
B1:F9EF 90 FE 63              mov   DPTR, #XRAM_FE63
B1:F9F2 EF                    mov   A, R7
B1:F9F3 F0                    movx  @DPTR, A
B1:F9F4 7F 7A                 mov   R7, #0x7A
B1:F9F6 7E 02                 mov   R6, #2
B1:F9F8 12 1B 96              lcall B1_BS_ARM_GetChar       ; Get the Item Ix and compare with the current
B1:F9F8
B1:F9FB 90 FD 62              mov   DPTR, #XRAM_FD62        ; _wCurrItem
B1:F9FE E0                    movx  A, @DPTR
B1:F9FF 6F                    xrl   A, R7
B1:FA00 70 00                 jnz   B1_FA02   ; This logic not ready yet
B1:FA02
B1:FA02             B1_FA02:
B1:FA02 7F 7B                 mov   R7, #0x7B
B1:FA04 7E 02                 mov   R6, #2
B1:FA06 12 1B 96              lcall B1_BS_ARM_GetChar
B1:FA06
B1:FA09 90 FD 63              mov   DPTR, #(XRAM_FD62+1)    ; _wCurrItem
B1:FA0C E0                    movx  A, @DPTR
B1:FA0D 6F                    xrl   A, R7
B1:FA0E 70 00                 jnz   B1_FA10   ; This logic not ready yet
B1:FA10
B1:FA10             B1_FA10:
B1:FA10 7F 78                 mov   R7, #0x78 ; 'x'
B1:FA12 7E 02                 mov   R6, #2
B1:FA14 12 1B 96              lcall B1_BS_ARM_GetChar
B1:FA14
B1:FA17 90 FE 61              mov   DPTR, #(XRAM_FE60+1)    ; Save min - first in BCD, then Binary
B1:FA1A EF                    mov   A, R7
B1:FA1B F0                    movx  @DPTR, A
B1:FA1C 12 1B 5A              lcall B1_bBCDToHEX
B1:FA1C
B1:FA1F 90 FE 64              mov   DPTR, #(XRAM_FE63+1)
B1:FA22 EF                    mov   A, R7
B1:FA23 F0                    movx  @DPTR, A
B1:FA24 7F 79                 mov   R7, #0x79 ; 'y'
B1:FA26 7E 02                 mov   R6, #2
B1:FA28 12 1B 96              lcall B1_BS_ARM_GetChar
B1:FA28
B1:FA2B 90 FE 62              mov   DPTR, #(XRAM_FE60+2)    ; Save sec - first in BCD, then Binary
B1:FA2E EF                    mov   A, R7
B1:FA2F F0                    movx  @DPTR, A
B1:FA30 12 1B 5A              lcall B1_bBCDToHEX
B1:FA30
B1:FA33 90 FE 65              mov   DPTR, #(XRAM_FE63+2)
B1:FA36 EF                    mov   A, R7
B1:FA37 F0                    movx  @DPTR, A
B1:FA38 90 FE 63              mov   DPTR, #XRAM_FE63        ; Check that the time is valid for this movie
B1:FA3B E0                    movx  A, @DPTR
B1:FA3C FF                    mov   R7, A
B1:FA3D A3                    inc   DPTR
B1:FA3E E0                    movx  A, @DPTR
B1:FA3F FD                    mov   R5, A
B1:FA40 A3                    inc   DPTR
B1:FA41 E0                    movx  A, @DPTR
B1:FA42 FB                    mov   R3, A
B1:FA43 12 BF DA              lcall fgCheckItemTimeValid
B1:FA43
B1:FA46 40 04                 jc    isoResumePatch_DOIT
B1:FA46
B1:FA48 00                    nop
B1:FA49 00                    nop
B1:FA49
B1:FA4A             ; Just a temp step for the short jump
B1:FA4A             isoResumePatch_EXIT_J1:                 ; CODE XREF: isoResumePatch+15j
B1:FA4A 80 32                 sjmp  isoResumePatch_EXIT
B1:FA4A
B1:FA4C             ; ---------------------------------------------------------------------------
B1:FA4C
B1:FA4C             isoResumePatch_DOIT:                    ; CODE XREF: isoResumePatch+76j
B1:FA4C 90 FE 60              mov   DPTR, #XRAM_FE60        ; Display the time before jump
B1:FA4F E0                    movx  A, @DPTR
B1:FA50 FF                    mov   R7, A
B1:FA51 A3                    inc   DPTR
B1:FA52 E0                    movx  A, @DPTR
B1:FA53 FD                    mov   R5, A
B1:FA54 A3                    inc   DPTR
B1:FA55 E0                    movx  A, @DPTR
B1:FA56 FB                    mov   R3, A
B1:FA57 90 FB A0              mov   DPTR, #XRAM_FBA0
B1:FA5A 74 06                 mov   A, #6
B1:FA5C F0                    movx  @DPTR, A
B1:FA5D 12 1D 22              lcall B1_vOsdShowIsoTimeRemain2
B1:FA5D
B1:FA60 90 FE 5D              mov   DPTR, #XRAM_FE5D        ; Set up the params for vSendUopCmd
B1:FA63 74 23                 mov   A, #0x23 ; '#'
B1:FA65 F0                    movx  @DPTR, A
B1:FA66 90 FE 63              mov   DPTR, #XRAM_FE63
B1:FA69 E0                    movx  A, @DPTR
B1:FA6A 90 FE 5E              mov   DPTR, #(XRAM_FE5D+1)
B1:FA6D F0                    movx  @DPTR, A
B1:FA6E 90 FE 64              mov   DPTR, #(XRAM_FE63+1)
B1:FA71 E0                    movx  A, @DPTR
B1:FA72 90 FE 5F              mov   DPTR, #(XRAM_FE5D+2)
B1:FA75 F0                    movx  @DPTR, A
B1:FA76 90 FE 65              mov   DPTR, #(XRAM_FE63+2)
B1:FA79 E0                    movx  A, @DPTR
B1:FA7A 90 FB F5              mov   DPTR, #XRAM_FBF5
B1:FA7D F0                    movx  @DPTR, A
B1:FA7D
B1:FA7E
B1:FA7E             isoResumePatch_EXIT:                    ; CODE XREF: isoResumePatch:isoResumePatch_EXIT_J1j
B1:FA7E 7D FF                 mov   R5, #0xFF               ; Invalidate the jump
B1:FA80 7F 77                 mov   R7, #0x77 ; 'w'
B1:FA82 7E 02                 mov   R6, #2
B1:FA84 12 1B A8              lcall B1_BS_ARM_PutChar
B1:FA84
B1:FA87 90 FE 5D              mov   DPTR, #0xFE5D           ; Execute vSendUopCmd
B1:FA8A E0                    movx  A, @DPTR
B1:FA8B FF                    mov   R7, A
B1:FA8C A3                    inc   DPTR
B1:FA8D E0                    movx  A, @DPTR
B1:FA8E FD                    mov   R5, A
B1:FA8F A3                    inc   DPTR
B1:FA90 E0                    movx  A, @DPTR
B1:FA91 FB                    mov   R3, A
B1:FA92 12 1B 9C              lcall B1_vSendUopCmd
B1:FA92
B1:FA95 22                    ret
B1:FA95
B1:FA95             ; End of function isoResumePatch
B1:FA95

Я посмотрел в IDA, какой самый высокий XRAM адрес используется в коде, и для временных переменных занял адреса чуть выше самых высоких:

CODE
;-------------------------------------------------------------------
;
; XRAM_FE5D..XRAM_FE5F - save orig function params
; XRAM_FE60..XRAM_FE62 - BCD time to jump to
; XRAM_FE63..XRAM_FE65 - Binary time to jump to
;
;-------------------------------------------------------------------

(3)
QUOTE
за границей максимального eeprom начинается зона сохранения положения на диске. Править надо далеко не в одном месте.

Ну, а за зоной сохранения уже ничего не начинается (кажется). :) Т.е. то, куда пишет vEepromWriteLastMemList, и есть самый конец полезной части EEPROM. В моем случае это 0х20C. Ну хорошо, теоретически там может быть еще MAGIC2 - пропустим еще несколько байт для верности. Остальное, вероятно, не принадлежит никому? Берем простые ф-ции vEepromWriteLastMemList и fgEepromLoadLastMemList, и моделируем на их основе:

vEepromSaveShMem (WORD eAddr, WORD shAddr, BYTE len)
и
fgEepromLoadShMem (WORD eAddr, WORD shAddr, BYTE len)

Возможно я ошибаюсь, и так делать нельзя. Я еще не закончил кодировать ассемблер, и тем более - не тестировал. :)

Самое поганое, однако, в том, что даже если я доваяю свой патч, и он будет у меня работать, переносить его на другие прошивки без очень хорошего знания и изучения соответствия между исходниками и реальной имплементацией будет архисложно. Я, разумеется, пока все делаю для Филипс 5960/37, прошивку которого я почти полностью проследил, но даже перенос на почти идентичный 5960/12 будет не совсем тривиален. :(

This post has been edited by vboroda on 30-05-2007, 05:57
PM Email Poster
Top Bottom
 cax Member is Offline
 Posted: 30-05-2007, 15:10 (post 754, #753601)

Pro Member

Group: Members
Posts: 738
Warn:0%-----
vboroda: теперь ты можешь предлагать свои услуги продавцам DVD, которые захотят продвигать на рынке аппараты с более продвинутым функционалом, чем у конкурентов.

Поскольку сделать подобную штуку нетривиально даже тем, кто владеет ассемблером, то и все карты тебе в руки.
PM Email Poster
Top Bottom
 Andy007 Member is Offline
 Posted: 30-05-2007, 16:52 (post 755, #753617)

Newbie

Group: Members
Posts: 39
Warn:0%-----
У NA есть исходники для xoro, medion и для cyberhome. Так что сравнивать в бинарном виде изменения - бесполезно.

Не делится потому что подписывал кучу NDA.

PM Email Poster
Top Bottom
 vboroda Member is Offline
 Posted: 30-05-2007, 17:18 (post 756, #753625)

Newbie

Group: Members
Posts: 21
Warn:0%-----
QUOTE (cax @ 30-05-2007, 12:10)
vboroda: теперь ты можешь предлагать свои услуги продавцам DVD, которые захотят продвигать на рынке аппараты с более продвинутым функционалом, чем у конкурентов.

Поскольку сделать подобную штуку нетривиально даже тем, кто владеет ассемблером, то и все карты тебе в руки.
Ты знаешь, со мной уже один продавец попытался связаться. Получил от него 2 мэйла. Не понимаю, что, собственно, он хочет мне предложить. :rolleyes: Перестать публиковать решения задач, и начать их продавать за какие-нибудь копейки? Сомневаюсь, что в этом бизнесе я смог бы заработать существенные деньги, не напрягаясь. Да и хобби уже тогда будет не хобби, а работой. Но работа у меня, слава Б-гу, пока есть, и вполне прилично оплачиваемая.

Меня немного раздражает другой аспект этой деятельности: постоянные просьбы что-то сделать. У кого-то похожая прошивка, кому-то хочется, чтобы плеер делал то-то и то-то, третьему срочно требуется, чтобы я поменял в прошивке шрифт. Каждая из этих просьб в отдельности меня бы не затруднила, но когда просьбы поступают с частотой 3 в день... А запортовать мою, скажем, GOTO фичу на похожий плеер Philps 5980 занимает часа три... :fu: У меня ведь еще и основная работа имеется, и дети с женой дома требуют внимания.
PM Email Poster
Top Bottom
 vboroda Member is Offline
 Posted: 30-05-2007, 17:37 (post 757, #753631)

Newbie

Group: Members
Posts: 21
Warn:0%-----
Кстати, сохранение в EEPROM (и восстановление) работает. Оттестировал, проблем не увидел. Если вы не возражаете, могу привести листинг ф-ций сохранения и восстановления с комментариями. В принципе, обе процедуры вполне портабельные: нужно только заменить XRAM адреса на те, которые можно использовать в вашей прошивке, и, разумеется, поправить все вызовы других функций (морока еще та).

В терминах языка С, параметры такие:
void vEepromSaveShMem (WORD eAddr, WORD shAddr, BYTE len);
BOOL fgEepromLoadShMem (WORD eAddr, WORD shAddr, BYTE len);

Я в своей прошивке вызываю их примерно так:

CODE
B5:F024             isoResumeLoadEepromPatch:               ; CODE XREF: fgEepromLoadLastMemListp
B5:F024 7E 02                 mov   R6, #2
B5:F026 7F 18                 mov   R7, #0x18
B5:F028 7C 02                 mov   R4, #2
B5:F02A 7D 77                 mov   R5, #0x77 ; 'w'
B5:F02C 7B 05                 mov   R3, #5
B5:F02E 90 EF 60              mov   DPTR, #fgEepromLoadShMem ; fgEepromLoadShMem (WORD eAddr, WORD shAddr, BYTE len)
B5:F02E                                                     ; R6R7 eAddr
B5:F02E                                                     ; R4R5 shAddr
B5:F02E                                                     ; R3   len
B5:F02E                                                     ;
B5:F02E                                                     ; XRAM_FE66              BYTE bIdCnt;
B5:F02E                                                     ; XRAM_FE67              BYTE bAddrCnt;
B5:F02E                                                     ; XRAM_FE68..XRAM_FE69   WORD wSize
B5:F02E                                                     ; XRAM_FE6A..XRAM_FE6B   WORD shBase
B5:F02E                                                     ; XRAM_FE6C              BYTE bData
B5:F031 12 18 EF              lcall B5_Bank_5
B5:F031
B5:F034 D2 61                 setb  RAM_2C.1                ; Now load the pointer (recover from patch)
B5:F036 90 FB 0C              mov   DPTR, #XRAM_FB0C
B5:F039 22                    ret
B5:F039
B5:F039             ; End of function isoResumeLoadEepromPatch

Таким образом, предложенная cax фича полностью реализована. Ну или почти полностью, т.к. я все еще пытаюсь придумать наиболее оптимальный вариант возобновления игры (сейчас я просто тупо запоминаю точку при останове, а при нажатии >>|, если есть запомненная точка, прыгаю на нее, и затираю. Я просто не уверен, что это не будет раздражать пользователя.)

This post has been edited by vboroda on 30-05-2007, 17:38
PM Email Poster
Top Bottom
 cax Member is Offline
 Posted: 30-05-2007, 17:47 (post 758, #753638)

Pro Member

Group: Members
Posts: 738
Warn:0%-----
Если у есть возможность сбросить память (скажем, в Пионере первое нажатие на "стоп" приостанавливает вопроизведение, а второе - останавливает совсем), то раздражать не должно.

Лично я бы добавил в меню пункт "Resume", но и с >>| тоже неплохо, как мне кажется. Проверь только, что это не мешает работе обычных DVD.
PM Email Poster
Top Bottom
 vboroda Member is Offline
 Posted: 30-05-2007, 18:09 (post 759, #753644)

Newbie

Group: Members
Posts: 21
Warn:0%-----
QUOTE (Andy007 @ 30-05-2007, 13:52)
У NA есть исходники для xoro, medion и для cyberhome. Так что сравнивать в бинарном виде изменения - бесполезно.
Исходники конкретных прошивок? Конечно, только 8032? Его ARM патчи явно не скомпиллированы с исходниками, хотя, судя по отсутствию явной логичности ассемблера, похоже, что он пишет их нa С, компиллирует каким-то THUMB компиллятором, а потом подправляет для вставки в прошивку.

Я на 99% уверен, что исходников ARM нет ни у кого, только в Mediatek. Иначе наши китайские друзья уже выложили бы их в открытый доступ.

Если у человека есть исходники конкретных прошивок, пусть в пределах 8032 кода, т.е. build environment, то сама по себе деятельность уже совершенно выходит из разряда хобби и хакинга. :music: Если бы я мог просто взять и откомпиллировать мою прошивку, я бы туда столько новых возможностей напихал...

Вопрос только в том, почему прошивки NA не распространяют сами производители устройств? Если они подрядили его улучшать их прошивки, почему бы им не рекламировать свои устройства, как улучшенные по методу NA? :actu:
PM Email Poster
Top Bottom
 Rvs Member is Offline
 Posted: 30-05-2007, 18:25 (post 760, #753654)

Member

Group: Members
Posts: 126
Warn:0%-----
vboroda

Отлично!!! Даже очень!!! :punk:
есть вопрос:

в ф-ях
void vEepromSaveShMem (WORD eAddr, WORD shAddr, BYTE len);
BOOL fgEepromLoadShMem (WORD eAddr, WORD shAddr, BYTE len);

1. ты одновременно сохраняешь и в EEPROM и в ShMem?
2. XRAM_FE66 BYTE bIdCnt
XRAM_FE67 BYTE bAddrCnt и т.д. это то что функция возвращает/передаёт? и что оно означает?

не могу понять как это всё вяжеться с saveThePlayTimePatch, а так всё понятно и не сложно.

This post has been edited by Rvs on 30-05-2007, 18:29
PM Email Poster
Top Bottom
 vboroda Member is Offline
 Posted: 30-05-2007, 20:01 (post 761, #753696)

Newbie

Group: Members
Posts: 21
Warn:0%-----
Rvs,

В ShMem я сохраняю с помощью обычных ф-ций, ранее известных как ARM_PutChar/ARM_GetChar. Новые ф-ции берут len байтов по Shared Memory адресу shAddr, и запихивают их в EEPROM по адресу eAddr. И наоборот. :)

XRAM_ ссылки используются в кач-ве локальных переменных функций. Я передаю параметры в ф-ции только через R6R7, R4R5 и R3.

Извините за длиннющий листинг, но я все-таки приведу здесь его ради иллюстрации:

CODE
B5:EED0             ; --------------- S U B R O U T I N E ---------------------------------------
B5:EED0
B5:EED0             ; vEepromSaveShMem (WORD eAddr, WORD shAddr, BYTE len)
B5:EED0             ;
B5:EED0             ; R6R7 eAddr
B5:EED0             ; R4R5 shAddr
B5:EED0             ; R3   len
B5:EED0             ; XRAM_FE66              BYTE bIdCnt;
B5:EED0             ; XRAM_FE67              BYTE bAddrCnt;
B5:EED0             ; XRAM_FE68..XRAM_FE69   WORD wSize
B5:EED0             ; XRAM_FE6A..XRAM_FE6B   WORD shBase
B5:EED0
B5:EED0             vEepromSaveShMem:                       ; DATA XREF: isoResumeSaveEepromPatch+Ao
B5:EED0 1B                    dec   R3
B5:EED1 90 FE 69              mov   DPTR, #(XRAM_FE68+1)    ; Get the EEPROM ptr to the end of copy
B5:EED4 EF                    mov   A, R7
B5:EED5 2B                    add   A, R3
B5:EED6 F0                    movx  @DPTR, A
B5:EED7 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EEDA EE                    mov   A, R6
B5:EEDB 34 00                 addc  A, #0
B5:EEDD F0                    movx  @DPTR, A
B5:EEDE 90 FE 6A              mov   DPTR, #XRAM_FE6A        ; Save ShMem address
B5:EEE1 EC                    mov   A, R4
B5:EEE2 F0                    movx  @DPTR, A
B5:EEE3 A3                    inc   DPTR
B5:EEE4 ED                    mov   A, R5
B5:EEE5 F0                    movx  @DPTR, A
B5:EEE6 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EEE9 E0                    movx  A, @DPTR
B5:EEEA 90 FE 66              mov   DPTR, #XRAM_FE66
B5:EEED F0                    movx  @DPTR, A
B5:EEEE 90 FE 69              mov   DPTR, #(XRAM_FE68+1)
B5:EEF1 E0                    movx  A, @DPTR
B5:EEF2 90 FE 67              mov   DPTR, #XRAM_FE67        ; bAddrCnt = ((BYTE *)&wSize)[1];
B5:EEF5 F0                    movx  @DPTR, A
B5:EEF6 A3                    inc   DPTR                    ; wSize = len - 1;
B5:EEF7 E4                    clr   A
B5:EEF8 F0                    movx  @DPTR, A
B5:EEF9 A3                    inc   DPTR
B5:EEFA EB                    mov   A, R3
B5:EEFB F0                    movx  @DPTR, A
B5:EEFB
B5:EEFC
B5:EEFC             vEepromSaveShMem_LOOP:                  ; CODE XREF: vEepromSaveShMem+7Aj
B5:EEFC                                                     ; vEepromSaveShMem+82j
B5:EEFC 90 FE 6B              mov   DPTR, #(XRAM_FE6A+1)    ; Get the curr ShMem addr. (LSB)
B5:EEFF E0                    movx  A, @DPTR
B5:EF00 FF                    mov   R7, A
B5:EF01 90 FE 69              mov   DPTR, #(XRAM_FE68+1)
B5:EF04 E0                    movx  A, @DPTR
B5:EF05 2F                    add   A, R7
B5:EF06 FF                    mov   R7, A
B5:EF07 90 FE 6A              mov   DPTR, #XRAM_FE6A        ; Get the curr ShMem addr. (MSB)
B5:EF0A E0                    movx  A, @DPTR
B5:EF0B FE                    mov   R6, A
B5:EF0C 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EF0F E0                    movx  A, @DPTR
B5:EF10 3E                    addc  A, R6
B5:EF11 FE                    mov   R6, A
B5:EF12 12 1B 96              lcall B5_ARM_GetChar          ; Get the byte
B5:EF12
B5:EF15 CE                    xch   A, R6                   ; Write it into EEPROM
B5:EF16 EF                    mov   A, R7
B5:EF17 CE                    xch   A, R6
B5:EF18 90 FE 66              mov   DPTR, #XRAM_FE66
B5:EF1B 12 E8 5C              lcall fgWrite_EEPROMByteDirect_PTR
B5:EF1B
B5:EF1E 50 34                 jnc   vEepromSaveShMem_EXIT
B5:EF1E
B5:EF20 90 FE 68              mov   DPTR, #XRAM_FE68        ; if (wSize == 0) done
B5:EF23 E0                    movx  A, @DPTR
B5:EF24 70 02                 jnz   B5_EF28
B5:EF24
B5:EF26 A3                    inc   DPTR
B5:EF27 E0                    movx  A, @DPTR
B5:EF27
B5:EF28
B5:EF28             B5_EF28:                                ; CODE XREF: vEepromSaveShMem+54j
B5:EF28 70 03                 jnz   B5_EF2D
B5:EF28
B5:EF2A 02 EE 29              ljmp  fgWait_EEPROMAckOK
B5:EF2A
B5:EF2D             ; ---------------------------------------------------------------------------
B5:EF2D
B5:EF2D             B5_EF2D:                                ; CODE XREF: vEepromSaveShMem:B5_EF28j
B5:EF2D 90 FE 69              mov   DPTR, #(XRAM_FE68+1)    ; wSize --;
B5:EF30 E0                    movx  A, @DPTR
B5:EF31 24 FF                 add   A, #0xFF
B5:EF33 F0                    movx  @DPTR, A
B5:EF34 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EF37 E0                    movx  A, @DPTR
B5:EF38 34 FF                 addc  A, #0xFF
B5:EF3A F0                    movx  @DPTR, A
B5:EF3B 90 FE 67              mov   DPTR, #XRAM_FE67        ; if (bAddrCnt == 0)
B5:EF3B                                                     ; {
B5:EF3B                                                     ;   bAddrCnt = 0xff;
B5:EF3B                                                     ;   bIdCnt--;
B5:EF3B                                                     ; }
B5:EF3B                                                     ; else
B5:EF3B                                                     ; {
B5:EF3B                                                     ;   bAddrCnt--;
B5:EF3B                                                     ; }
B5:EF3E E0                    movx  A, @DPTR
B5:EF3F 70 0B                 jnz   B5_EF4C
B5:EF3F
B5:EF41 74 FF                 mov   A, #0xFF
B5:EF43 F0                    movx  @DPTR, A
B5:EF44 90 FE 66              mov   DPTR, #XRAM_FE66
B5:EF47 E0                    movx  A, @DPTR
B5:EF48 14                    dec   A
B5:EF49 F0                    movx  @DPTR, A
B5:EF4A 80 B0                 sjmp  vEepromSaveShMem_LOOP
B5:EF4A
B5:EF4C             ; ---------------------------------------------------------------------------
B5:EF4C
B5:EF4C             B5_EF4C:                                ; CODE XREF: vEepromSaveShMem+6Fj
B5:EF4C 90 FE 67              mov   DPTR, #XRAM_FE67
B5:EF4F E0                    movx  A, @DPTR
B5:EF50 14                    dec   A
B5:EF51 F0                    movx  @DPTR, A
B5:EF52 80 A8                 sjmp  vEepromSaveShMem_LOOP
B5:EF52
B5:EF54             ; ---------------------------------------------------------------------------
B5:EF54
B5:EF54             vEepromSaveShMem_EXIT:                  ; CODE XREF: vEepromSaveShMem+4Ej
B5:EF54 22                    ret
B5:EF54
B5:EF54             ; End of function vEepromSaveShMem
B5:EF54
B5:EF54             ; ---------------------------------------------------------------------------
B5:EF55 FF                    .byte 0xFF
B5:EF56 FF                    .byte 0xFF
B5:EF57 FF                    .byte 0xFF
B5:EF58 FF                    .byte 0xFF
B5:EF59 FF                    .byte 0xFF
B5:EF5A FF                    .byte 0xFF
B5:EF5B FF                    .byte 0xFF
B5:EF5C FF                    .byte 0xFF
B5:EF5D FF                    .byte 0xFF
B5:EF5E FF                    .byte 0xFF
B5:EF5F FF                    .byte 0xFF
B5:EF60
B5:EF60             ; --------------- S U B R O U T I N E ---------------------------------------
B5:EF60
B5:EF60             ; fgEepromLoadShMem (WORD eAddr, WORD shAddr, BYTE len)
B5:EF60             ; R6R7 eAddr
B5:EF60             ; R4R5 shAddr
B5:EF60             ; R3   len
B5:EF60             ;
B5:EF60             ; XRAM_FE66              BYTE bIdCnt;
B5:EF60             ; XRAM_FE67              BYTE bAddrCnt;
B5:EF60             ; XRAM_FE68..XRAM_FE69   WORD wSize
B5:EF60             ; XRAM_FE6A..XRAM_FE6B   WORD shBase
B5:EF60             ; XRAM_FE6C              BYTE bData
B5:EF60
B5:EF60             fgEepromLoadShMem:                      ; DATA XREF: isoResumeLoadEepromPatch+Ao
B5:EF60 D2 61                 setb  RAM_2C.1
B5:EF62 1B                    dec   R3
B5:EF63 90 FE 69              mov   DPTR, #(XRAM_FE68+1)    ; Get the EEPROM PTR to the End of Copy
B5:EF66 EF                    mov   A, R7
B5:EF67 2B                    add   A, R3
B5:EF68 F0                    movx  @DPTR, A
B5:EF69 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EF6C EE                    mov   A, R6
B5:EF6D 34 00                 addc  A, #0
B5:EF6F F0                    movx  @DPTR, A
B5:EF70 90 FE 6A              mov   DPTR, #XRAM_FE6A        ; Save ShMem base
B5:EF73 EC                    mov   A, R4
B5:EF74 F0                    movx  @DPTR, A
B5:EF75 A3                    inc   DPTR
B5:EF76 ED                    mov   A, R5
B5:EF77 F0                    movx  @DPTR, A
B5:EF78 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EF7B E0                    movx  A, @DPTR
B5:EF7C 90 FE 66              mov   DPTR, #XRAM_FE66        ; bIdCnt = ((BYTE *)&wSize)[0];
B5:EF7F F0                    movx  @DPTR, A
B5:EF80 90 FE 69              mov   DPTR, #(XRAM_FE68+1)
B5:EF83 E0                    movx  A, @DPTR
B5:EF84 90 FE 67              mov   DPTR, #XRAM_FE67        ; bAddrCnt = ((BYTE *)&wSize)[1];
B5:EF87 F0                    movx  @DPTR, A
B5:EF88 A3                    inc   DPTR                    ; wSize = len - 1;
B5:EF89 E4                    clr   A
B5:EF8A F0                    movx  @DPTR, A
B5:EF8B A3                    inc   DPTR
B5:EF8C EB                    mov   A, R3
B5:EF8D F0                    movx  @DPTR, A
B5:EF8D
B5:EF8E
B5:EF8E             fgEepromLoadShMem_LOOP:                 ; CODE XREF: fgEepromLoadShMem+96j
B5:EF8E                                                     ; fgEepromLoadShMem+9Ej
B5:EF8E 90 FE 66              mov   DPTR, #XRAM_FE66
B5:EF91 E0                    movx  A, @DPTR
B5:EF92 24 50                 add   A, #0x50 ; 'P'
B5:EF94 FF                    mov   R7, A
B5:EF95 A3                    inc   DPTR
B5:EF96 E0                    movx  A, @DPTR
B5:EF97 FD                    mov   R5, A
B5:EF98 90 FB 70              mov   DPTR, #XRAM_FB70
B5:EF9B 74 01                 mov   A, #1
B5:EF9D F0                    movx  @DPTR, A
B5:EF9E A3                    inc   DPTR
B5:EF9F 74 FE                 mov   A, #0xFE ; '¦'
B5:EFA1 F0                    movx  @DPTR, A
B5:EFA2 A3                    inc   DPTR
B5:EFA3 74 6C                 mov   A, #0x6C ; 'l'
B5:EFA5 F0                    movx  @DPTR, A
B5:EFA6 7B 01                 mov   R3, #1
B5:EFA8 12 E6 A7              lcall fgI2CByteRead           ; BOOL fgI2CByteRead(BYTE bDevice, BYTE bData_Addr, BYTE *pbData)
B5:EFA8
B5:EFAB 40 04                 jc    B5_EFB1
B5:EFAB
B5:EFAD C2 61                 clr   RAM_2C.1
B5:EFAF 80 4F                 sjmp  fgEepromLoadShMem_EXIT
B5:EFAF
B5:EFB1             ; ---------------------------------------------------------------------------
B5:EFB1
B5:EFB1             B5_EFB1:                                ; CODE XREF: fgEepromLoadShMem+4Bj
B5:EFB1 90 FE 6B              mov   DPTR, #(XRAM_FE6A+1)    ; Calc. the curr. ShMem addr. (LSB)
B5:EFB4 E0                    movx  A, @DPTR
B5:EFB5 FF                    mov   R7, A
B5:EFB6 90 FE 69              mov   DPTR, #(XRAM_FE68+1)
B5:EFB9 E0                    movx  A, @DPTR
B5:EFBA 2F                    add   A, R7
B5:EFBB FF                    mov   R7, A
B5:EFBC 90 FE 6A              mov   DPTR, #XRAM_FE6A        ; Calc. the curr. ShMem addr. (MSB)
B5:EFBF E0                    movx  A, @DPTR
B5:EFC0 FE                    mov   R6, A
B5:EFC1 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EFC4 E0                    movx  A, @DPTR
B5:EFC5 3E                    addc  A, R6
B5:EFC6 FE                    mov   R6, A
B5:EFC7 90 FE 6C              mov   DPTR, #XRAM_FE6C
B5:EFCA E0                    movx  A, @DPTR
B5:EFCB FD                    mov   R5, A
B5:EFCC 12 1B A8              lcall B5_ARM_PutChar          ; Write bData to ShMem
B5:EFCC
B5:EFCF 90 FE 68              mov   DPTR, #XRAM_FE68        ; if (wSize == 0) break;
B5:EFD2 E0                    movx  A, @DPTR
B5:EFD3 70 02                 jnz   B5_EFD7
B5:EFD3
B5:EFD5 A3                    inc   DPTR
B5:EFD6 E0                    movx  A, @DPTR
B5:EFD6
B5:EFD7
B5:EFD7             B5_EFD7:                                ; CODE XREF: fgEepromLoadShMem+73j
B5:EFD7 60 27                 jz    fgEepromLoadShMem_EXIT
B5:EFD7
B5:EFD9 90 FE 69              mov   DPTR, #(XRAM_FE68+1)    ; wSize--;
B5:EFDC E0                    movx  A, @DPTR
B5:EFDD 24 FF                 add   A, #0xFF
B5:EFDF F0                    movx  @DPTR, A
B5:EFE0 90 FE 68              mov   DPTR, #XRAM_FE68
B5:EFE3 E0                    movx  A, @DPTR
B5:EFE4 34 FF                 addc  A, #0xFF
B5:EFE6 F0                    movx  @DPTR, A
B5:EFE7 90 FE 67              mov   DPTR, #XRAM_FE67        ; if (bAddrCnt == 0)
B5:EFE7                                                     ; {
B5:EFE7                                                     ;   bAddrCnt = 0xff;
B5:EFE7                                                     ;   bIdCnt--;
B5:EFE7                                                     ; }
B5:EFE7                                                     ; else
B5:EFE7                                                     ; {
B5:EFE7                                                     ;   bAddrCnt--;
B5:EFE7                                                     ; }
B5:EFEA E0                    movx  A, @DPTR
B5:EFEB 70 0B                 jnz   B5_EFF8
B5:EFEB
B5:EFED 74 FF                 mov   A, #0xFF
B5:EFEF F0                    movx  @DPTR, A
B5:EFF0 90 FE 66              mov   DPTR, #XRAM_FE66
B5:EFF3 E0                    movx  A, @DPTR
B5:EFF4 14                    dec   A
B5:EFF5 F0                    movx  @DPTR, A
B5:EFF6 80 96                 sjmp  fgEepromLoadShMem_LOOP
B5:EFF6
B5:EFF8             ; ---------------------------------------------------------------------------
B5:EFF8
B5:EFF8             B5_EFF8:                                ; CODE XREF: fgEepromLoadShMem+8Bj
B5:EFF8 90 FE 67              mov   DPTR, #XRAM_FE67
B5:EFFB E0                    movx  A, @DPTR
B5:EFFC 14                    dec   A
B5:EFFD F0                    movx  @DPTR, A
B5:EFFE 80 8E                 sjmp  fgEepromLoadShMem_LOOP
B5:EFFE
B5:F000             ; ---------------------------------------------------------------------------
B5:F000
B5:F000             fgEepromLoadShMem_EXIT:                 ; CODE XREF: fgEepromLoadShMem+4Fj
B5:F000                                                     ; fgEepromLoadShMem:B5_EFD7j
B5:F000 A2 61                 mov   C, RAM_2C.1
B5:F002 22                    ret
B5:F002
B5:F002             ; End of function fgEepromLoadShMem

bIdCnt и bAddrCnt - местные переменные ф-ций. Чтобы понять, в чем их смысл, почитай исходники "оригиналов" - vEepromWriteLastMemList, fgEepromLoadLastMemList и т.д. Стыковка такая же, как во всем 8032 софте. Данные хранятся в указанных мною ячейках Shared Memory во время нормальной работы устройства. Когда устройство выключают (уходит в STANDBY mode), вызываются ф-ции сохранения параметров из Shared Memory в EEPROM. Одна из них:

CODE
B5:DC3C             vEepromWriteLastMemList:                ; CODE XREF: B5_D0A4+5p
B5:DC3C                                                     ; DATA XREF: B0:B0_BS_438_B5_DC3Co ...
B5:DC3C 12 F0 10              lcall isoResumeSaveEepromPatch
B5:DC3C
B5:DC3F 74 02                 mov   A, #2

Когда устройство включается, другие ф-ции считывают полезную информацию из EEPROM в Shared Memory. Одна из них вызывает теперь мою вторую ф-цию:

CODE
B5:C762             fgEepromLoadLastMemList:                ; CODE XREF: vEepromInit+44p
B5:C762 12 F0 24              lcall isoResumeLoadEepromPatch
B5:C762
B5:C765 00                    nop
B5:C766 00                    nop
B5:C767 74 02                 mov   A, #2

Код патча я уже привел. По сути это вызов C процедуры:

CODE
fgEepromLoadShMem (0х218, 0х277, 5); // From ShMem addr 0x277 write 5 bytes to address 0x218 of EEPROM

Ну а ф-ции, имеющие дело с сохранением и восстановлением точки запуска, знают только об адресе 0х277 в Shared Mem. Им нет никакого дела до EEPROM.

This post has been edited by vboroda on 30-05-2007, 20:08
PM Email Poster
Top Bottom
 Rvs Member is Offline
 Posted: 31-05-2007, 16:09 (post 762, #753948)

Member

Group: Members
Posts: 126
Warn:0%-----
vboroda

Блин толково ты всё сделал!!! по больше таких програмеров!!! :punk:
Буду к себе добавлять, как только так сразу отпишусь!!!!
PM Email Poster
Top Bottom
 vboroda Member is Offline
   Posted: 22-06-2007, 21:38 (post 763, #760131)

Newbie

Group: Members
Posts: 21
Warn:0%-----
Привет, если эта тема еще дышит. ;)

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

Имеется прошивка с ARM кодом из трех частей. Аппарат Philips 5960. Распаковал этот ARM код (весь сразу) MTKReMaker'ом. Вроде бы все нормально, но выясняются интересные вещи: многие пойнтеры указывают на адреса, по которым вроде как располагается в распакованном виде исполняемый код. Скажем, делаю патч для UOP removal. Нахожу участок кода. Ба, да буфер UOP_Parameters "расположен" прямо на середине какой-то ф-ции! Здесь, правда, ничего страшного не произошло, т.к. не требовалось создавать никаких новых ф-ций и куда-либо прыгать.

Еще пример: попытка поставить P&S патч от fontcreator'a. Ф-цию находим сразу, но размещена она в "высоких" адресах (0х8ХХХХ). У нас еще полно места на C++ мессиджах, расширять код пока не требуется. Попытаемся прыгнуть из "верхней" части кода на место, где располагаются С++ мессиджи. Я попробовал, и получил намертво зависший плеер.

В общем, подозреваю, что алгоритм распаковки ARM кода не совсем правильно (или совсем неправильно?) отрабатывает "верхнюю" часть кода, помещая ее в менее высокие адреса, чем те, по которым она на самом деле размещается в работающей системе. Более того, я также не уверен, что алгоритм "расширения" ARM кода, применяемый в программе MtkArmResizer, правильно учитывает расположение "верхней" части кода.

Есть ли у кого-то комментарии или советы по этому поводу? Может быть я просто неправильно что-то делаю?

Большое спасибо за помощь!
PM Email Poster
Top Bottom
 jonia Member is Offline
 Posted: 30-06-2007, 19:01 (post 764, #761994)

Newbie

Group: Members
Posts: 1
Warn:0%-----
QUOTE (vboroda @ 30-05-2007, 17:18)
Меня немного раздражает другой аспект этой деятельности: постоянные просьбы что-то сделать ......

... но когда просьбы поступают с частотой 3 в день.....

Здравствуйте Владимир,
Знаю, что досадно, но что сделать, на днях купил dvp-5980/12, потому что 5960 уже пропал, не продают его...

Хотелось бы тоже самое, как на модели 5960/12, если конечно найдется времени на это...

ver: 12.07.31.26
sub: 07.08.02.01
8032: 05.00.06.05
servo: 93.77.00.00
risc: 05.00.06.05
DSP: 07.03.00.81

С уважением Джони А!
PM Email Poster
Top Bottom
 RanDoM133 Member is Offline
 Posted: 19-10-2007, 18:38 (post 765, #787987)

Newbie

Group: Members
Posts: 1
Warn:0%-----
QUOTE (Andy007 @ 20-04-2006, 14:02)
Меню в старых 8032 я умею добавлять - в принципе тоже самое что и skip по mp3:) Осталось найти работоспособный риск.
Не могли бы Вы намекнуть как сделать сие с 8032 фили 3040К?
Решил проблемку сам :)

This post has been edited by RanDoM133 on 22-10-2007, 17:01
PM Email Poster
Top Bottom
Topic Options Pages: (52) 1 2 3 .. 6 .. 9 .. 12 .. 15 .. 18 .. 21 .. 24 .. 27 .. 30 .. 33 .. 36 .. 39 .. 42 .. 45 .. 48 49 50 [51] 52