4PDA – не только КПК
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

Настоятельно рекомендуем прочитать Правила раздела "Windows Mobile - прошивки"

Новые темы необходимо создавать только в корневом разделе! В дальнейшем они будут обработаны модераторами.

 
 
Ответить
> Исправление глюка GWES vs 2700g, Как самому исправить отрисовку меню
dking
13.7.2008, 13:18
Сообщение #1

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

Уважаемые модераторы, прошу подобрать подходящее место для данной темы...
В кратце: данная информация позволяет самостоятельно исправлять новые билды WM 6.1 в плане глюка прорисовки меню, который был выявлен на машинках с графикой i2700g, в частности - Dell Axim X51v

Удаление градиентной заливки из меню, замена заливки на сплошную.

Проблема
С выходом последних билдов WM 6.1 оказалось, что при установке их на КПК Dell Axim X51v возникает странная проблема с перерисовкой «всплывающих» каскадных меню. Проблема заключается в том, что если из какого-либо меню раскрыть подменю, затем сразу (не закрывая) попытаться открыть другое подменю, то в результате основное меню перекрывает всплывающее. В общем, словами описать достаточно сложно — но результат хорошо виден на картинке, сделанной пользователем Snusman: Изображение

Варианты решения
Самый простой вариант решения — не открывать новое подменю при уже открытом smile_good.gif Но мы легких путей не ищем, и будем исправлять прошивку.
Следующий вариант решения — вернуть перерисовку меню в тот вид, в котором она была в предыдущих билдах — то есть избавиться от градиента. Собственно про этот метод речь и пойдет.
Существует более сложный метод решения проблемы, но о нем — не в этот раз.

Кому это надо
Описанный далее метод исправления проблемы с перерисовкой меню предназначен, в первую очередь тем, кто делает собственные прошивки для КПК/Коммуникаторов.

Ответственность
Как обычно, никто не несет ответственности за какие-либо действия или их отсутствие, связанные с данным текстом smile_good.gif

Немного о GWES.EXE
Данный файл (Graphics, Windowing and Events Subsystem) в ОС Windows Mobile отвечает за поведение графической, оконной и «событийной» подсистем. В нашем случае именно он отвечает за отрисовку меню и, соответственно, подлежит изменению.
О том, как получить файл из прошивки писать здесь смысла нет. Скажу только, что он нам нужен как в виде файла (собирается с помощью RecMod.exe), так и в виде модуля (разбирается через reversmode.exe).

Последовательность действий
1.Распаковываем прошивку.
2.Получаем gwes.exe в виде файла. Попутно делаем его резервную копию в виде модуля.
3.Редактируем файл.
4.Разбираем измененный файл в модуль с помощью reversmode.exe.
5.(!!!!) В исходный модуль копируем только сами секции (файлы Sxxx без расширения)! Файлы imageinfo.* должны остаться оригинальными из прошивки!
6.С вновь полученными секциями в модуле собираем прошивку и радуемся.

Редактирование GWES.EXE
Это самый сложный этап — собственно само исправление. От точности действий зависит работоспособность прошивки. Замечу, что в будущих билдах возможны коренные изменения, которые потребуют корректировки данной инструкции.
Для редактирования нам потребуется любой дееспособный HEX-редактор с возможностью поиска. Я пользовался Hex Workshop.

Этап первый — вычисление смещений ключевых функций
1.Открываем gwes.exe в hex-редакторе.
2.Задаем команду поиска шестнадцатеричных значений. В строке поиска вводим «04E02DE504D04DE224309FE51C209FE501E0A0E3003093E5».
3.Записываем смещение в файле, по которому нашлась данная последовательность (смещение - в шестнадцатеричном виде!). Назовем этот адрес Func_0. (Например, Func_0 = 6BCC0).
4.Аналогично проделываем с другой последовательностью - «30402DE904D04DE20151C0E31C0055E3». Смещение в шестнадцатеричном виде назовем Func_1. (Например, Func_1 = 68CD0)
5.Аналогично для «0DC0A0E104002DE970582DE918B08DE240D04DE20250A0E1». Адрес назовем Func_2. (Например, Func_2 = 5E17C).
6.Еще нам потребуется два смещения. Первое (назовем Call_1) получается прибавлением к Func_0 значения 0x10. (Например, Call_1 = Func_0+0x10 = 0x6BCC0 + 0x10 = 6BCD0). Второе — Call_2 — получается прибавлением к Func_0 значения 0x20. (Например, Call_2 = Func_0 + 0x20 = 0x6BCC0 + 0x20 = 6BCE0).

Этап второй — вычисление машинных кодов для инструкций перехода
1.Далее нам потребуется моя небольшая утилитка, вычисляющая смещения для ARM — инструкций перехода. Скачать ее можно здесь: http://rapidshare.com/files/129332578/arm_offset.rar
2.Запускаем утилитку. В поле Command Address вводим адрес Call_1 в шестнадцатеричном виде без префикса «0x» (например, Command Address = 6BCD0). В поле Jump to Address вводим адрес Func_1 (например, Jump to Address = 68CD0). Нажимаем «Calc». Нас интересует тот результат, который отображен напротив строки «BL (function call)». Запоминаем (записываем) данные четыре байта (по две шестнадцатеричных цифры в каждом). Для удобства назовем их Bytes_1 (Например, получилось Bytes_1 = FE F3 FF EB).
3.Аналогично проделываем с Command Address = Call_2 и Jump to Address = Func2, снова нажимаем «Calc». Запоминаем (записываем) полученные четыре байта как Bytes_2. (Например, получилось Bytes_2 = 25 C9 FF EB).

Этап третий — редактируем файл GWES.EXE
1.В hex-редакторе делаем переход на смещение Func_0 (у меня это команда Edit -> Go to... Offset (from beginning of file) ).
2.Далее в окне редактирования hex-кодов ЗАМЕНЯЕМ байты, начиная с того, на котором встал курсор, на следующие: 30 40 2D E9 01 50 A0 E1 00 40 A0 E1 11 01 A0 E3.
3.После этого курсор должен оказаться в позиции Call_1. В этом месте следует записать четыре байта из Bytes_1. (В примере это FE F3 FF EB).
4.Затем, не смещая курсор, продолжаем: 00 20 A0 E1 04 00 A0 E1 05 10 A0 E1.
5.После этого курсор должен оказаться в позиции Call_2. В этом месте следует записать четыре байта из Bytes_2. (В примере это 25 C9 FF EB).

6. Затем следует записать следующую последовательность байт: 00 00 A0 E1 30 40 BD E8.
7. Для точности следует убедиться, что следом будет идти 4 таких байта: 1E FF 2F E1


Вот и все редактирование. Не забываем измененный файл записать в прошивку в виде модуля по вышеприведенной инструкции. В итоге получаем отсутствие градиента в фоне меню, а соответственно и исправление «глюка» перерисовки.

Заключение
Как я уже упомянул, существует второй метод исправления бага, при котором остается градиентная заливка в меню. Этот метод значительно сложнее приведенного и обладает побочным эффектом — небольшим «промаргиванием» при перерисовке подменю. Если кому-нибудь будет интересно, могу в будущем написать мануал по второму способу. Но там без знания ARM-ассемблера, дизассемблера IDA 5.2 и тонкостей работы оконных сообщений Windows не обойтись.

Сообщение отредактировал dking - 18.7.2008, 3:28


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
dking
18.7.2008, 3:18
Сообщение #2

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

Ага, вот и оно
в билдах выше 19949 добавились очередные изменения в GWES, для них эта инструкция нуждается в дороботке (кстати, это вовсе не помешает предыдущим билдам). Вышеизложенный текст подправлен под новые билды.

Сообщение отредактировал dking - 18.7.2008, 3:25


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
Mforward
6.9.2009, 13:10
Сообщение #3


Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 148
Регистрация: 5.6.2006
Dell Axim X51v



Репутация:   31  

Глюк изчез после увеличения таймаута видео памяти

[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR]
"LocalMemoryTimeout"=dword:00002710

без правки GWES.
Прошивка A04RU_Beta2 + подписаный файлик гвеса из билда 20759 из какой-то завалявшейся асус кухни.
^
Вставить никЦитировать 
dking
6.9.2009, 13:32
Сообщение #4

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

Тема уже не актуальна smile_good.gif В новых прошах исправлен драйвер, всё работает.


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
dking
6.9.2009, 13:52
Сообщение #5

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

Сейчас специально прошился Football A08, повысил таймаут (это с "0xA" на "0x2719" ! ого-го себе smile_good.gif ). Результат отрицательный - глюк на месте. Да и вообще не совсем понятно - как таймаут памяти может вылечить явную ошибку реализации функции DrvGradientFill() в драйвере...


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
Mforward
6.9.2009, 22:40
Сообщение #6


Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 148
Регистрация: 5.6.2006
Dell Axim X51v



Репутация:   31  

Прошивка WM61DE-A04RU_Beta2 от Dynamite.

Где подсмотрел, сайт посеял (

[HKEY_LOCAL_MACHINE\SYSTEM\GWE]
; "PORepaint"=dword:0 - the display driver handles everything
; "PORepaint"=dword:1 - gwe should save and restore the bits
; "PORepaint"=dword:2 - gwe should invalidate and repaint
; "PORepaint"=dword:3 - gwe and driver need to save video memory
;
"PORepaint"=dword:3


#if ! defined PVR_CETESTKIT
[HKEY_LOCAL_MACHINE\System\GDI\Drivers]
"Display"="ddi_powervr.dll"
#endif

[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR]

; Single mode stuff
; mode list is trunkated to just one entry with the following settings
"Width"=dword:280
"Height"=dword:1E0
"BitsPerPixel"=dword:10
"OutputMask"=dword:00070707

; Display refresh
; Default wait time (in millisecs) after access before local memory goes into self-refresh
; 0x2710 == 10000 ms == 10 secs
; "LocalMemoryTimeout"=dword:2710
"LocalMemoryTimeout"=dword:A
; Only enable this if the on-die frame buffer is being used to display
"UseSelfRefresh"=dword:1

; Special sleep mode support - to support Marathon and LM off upon sleep
; 1 to enable it; 0 to disable it.
"SpecialSleep"=dword:1

; Marathon system configuration overrides
"VLIOChipSelect"=dword:5
"SRAMChipSelect"=dword:1
"SDRAMMemType"=dword:9

; Marathon Revision ID will be read from the SOC_ID register to determine
; the approprate setting for ODFB Active Power Mode. Active Low Power Mode
; will only be enabled in this way, for revisions A3 and later. This can be
; overrided as required (revisions A0 and A1 do not support ODFB
; Active Low Power Mode). Note: the revision ID for A2 cannot be distinguished
; from the revision ID for A1.
; "ODFBPowerModeActiveLow"=dword:1

; "Prefetch"=dword:0
; "Timeout"=dword:ffffff00
; "BondConfig"=dword:0
; "SPAccessViaVLIO"=dword:ffffffff

; "CoreClock"=dword:C65D40 ;13MHz (ie REFCLK)
; "CoreClock"=dword:17D7840 ;25MHz
; "CoreClock"=dword:2FaF080 ;50MHz
; "CoreClock"=dword:47868C0 ;75MHz
; "CoreClock"=dword:4C4B400 ;80MHz (MBX=/2)
; "CoreClock"=dword:5F5E100 ;100MHz (MBX=/2)
; "CoreClock"=dword:7ED6B40 ;133MHz (MBX=/2)
"Panel"=dword:00000005
"PanelExt"=dword:C0000002

; Screen rotation control
"DisableDynamicScreenRotation"=dword:0

IF OSV_PPC
"RotationRemap"=dword:10E
ENDIF

; Framebuffer allocation stratagy based on the allocation flags
; GPE_REQUIRE_VIDEO_MEMORY and GPE_PREFER_VIDEO_MEMORY
;
; default = 0 All FB memory,internal and external, available
; control is via a bit mask
; bit 0 Req Int FB, always assumed set
; bit 1 Req Ext FB
; bits 2 & 3 ignored
; bit 4 Pref Int FB
; bit 5 Pref Ext FB
; bits 6 - 31 ignored

; "FBAllocStrategy"=dword:21


[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Gl obal\D3DM]
[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Ga me Settings\D3DM]
[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Ga me Settings\D3DM\Common]
[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Ga me Settings\DDraw]
[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Ga me Settings\OpenGLES]
[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\Ga me Settings\OpenGLES\Common]

[HKEY_LOCAL_MACHINE\Drivers\Display\PowerVR\MBX1\La stApp]

[HKEY_LOCAL_MACHINE\system\gdi\rotation]
IF OSV_PPC
;angle from portrait origin for PocketPC
"Angle"=dword:0
"LandscapeMode"=dword:5A
ELSE
;angle from landscape origin for WinCE
IF WCE_LANDSCAPE
"Angle"=dword:0
ELSE
"Angle"=dword:10E
ENDIF
ENDIF

[HKEY_LOCAL_MACHINE\SYSTEM\GDI]
"ClearType"=dword:1

[HKEY_LOCAL_MACHINE\System\GDI\ClearTypeSettings]
;"NativeOrientation"=dword:0 ; 0 is the default. This is the angle that supports cleartype.
IF OSV_PPC
"OffOnRotation"=dword:1 ; 1 means "turn off Cleartype when rotated"
ENDIF

IF OSV_PPC
; Welcome.exe: Disable tutorial and calibration pages
; Touch calibration (0x02), Stylus (0x04), Popup menu (0x08), Timezone (0x10), Complete (0x20)
[HKEY_LOCAL_MACHINE\Software\Microsoft\Welcome]
; Touch calibration must be enabled for high res metrics.
"Disable"=dword:FFFFFFFD

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Player\Video]
; sets WMP default to use full screen if video is large
"Full Screen"=dword:00000001

; -- Specify high res metrics (192 DPI) for PocketPC with VGA panel
; -- For low res (320x240) panel use 96 DPI metrics.
[HKEY_LOCAL_MACHINE\Drivers\Display\GPE]
; 0xC0 = 192 This is DPI info
"LogicalPixelsX"=dword:C0
"LogicalPixelsY"=dword:C0
ENDIF

[HKEY_LOCAL_MACHINE\System\D3DM\Drivers]
"LocalHook"="pvr_d3dm.dll"

; PowerVR entries end ----------------------------------

Сообщение отредактировал Mforward - 6.9.2009, 23:08
^
Вставить никЦитировать 
dking
7.9.2009, 1:45
Сообщение #7

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

Ну да, есть такое дело smile_good.gif Еще можно выложить исходник драйвера и показать строку с ошибкой smile_good.gif И её же в бинарном виде в .DLL-ке smile_good.gif


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
Warhammer41k
18.11.2009, 4:37
Сообщение #8

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 317
Регистрация: 8.5.2007
Fujitsu-Siemens Loox C550



Репутация:   52  

Огромнейшее спасибо за инструкцию. У меня аналогичные проблемы с билдом 19965. Уж думал не получится отключить дурацкий градиент. Сейчас опробую ваши инструкции.


--------------------
Здесь можно скачать мои прошивки для N560 и C550, а также описания и дополнения.
Мои кухни для N560 и C550 находятся по этой ссылке
^
Вставить никЦитировать 
dking
18.11.2009, 14:24
Сообщение #9

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 184
Регистрация: 13.11.2005
Dell Axim X51v



Репутация:   41  

эээ... а проблема - она на C550 ???


--------------------
Hello, I'm your mind giving you someone to talk to...
^
Вставить никЦитировать 
Warhammer41k
18.11.2009, 19:32
Сообщение #10

Местный
*****
[offline]

Группа: Друзья 4PDA
Сообщений: 317
Регистрация: 8.5.2007
Fujitsu-Siemens Loox C550



Репутация:   52  

Ага. И тоже как раз с градиентом проблема связана оказалась. Но правда, не настолько серьезная как на i2700g. У нас при открытии подменю затираются некоторые пункты предыдущего меню. А также иногда отдельные пункты меню затираются при перемещении полоски, при выборе их джойстиком. И меню, которые не помещаются на 1 экран - с кнопками прокрутки снизу и сверху - иногда при прокрутке оставляют на экране кашу из предыдущих надписей. Кстати, градиенты на этих кнопках почему-то остались включенными. Не знаете случаем, как и их тоже отключить?

Я заметил, что у других авторов прошивок на наши устройства, градиента нет, вот и возникло предположение, что наверное градиент как-то влияет. Отключали-ли они его сами, или может-быть у них GWES из более старых билдов, где градиента нет - я не знаю.
У них билды 20755 - а для того чтобы эти билды у нас нормально заработали - надо вроде-бы взять ядро от билдов 2027x и gwes из билдов (19xxx). Я вот пытаюсь сделать прошивки на чистом билде 19965 (ну вернее почти чистом, я не нашел только офис с этим номером билда, но офис из 21054 - прекрасно работает, как не странно). И столкнулся с этой проблемой. Хотя в отличии от ваших устройств - с этим глюком вполне можно существовать, он в 99% случаев не мешает совсем (заметил его только сейчас - через 3 месяца использования этого билда).

Вобщем, спасибо еще раз за работающий способ. Мне помогло.


--------------------
Здесь можно скачать мои прошивки для N560 и C550, а также описания и дополнения.
Мои кухни для N560 и C550 находятся по этой ссылке
^
Вставить никЦитировать 

Ответить
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 3.9.10, 10:05