Доброго дня, коллеги!
Имеем следующего зверя - AEC-6910. Построено это чудо на базе чипсета i855GME.
Предыстория такова: необходимо вывести графику под FreeBSD и Xorg на панель с соотношением сторон 16:9. Драйвер видео i810(4) поддерживает работу только с режимами, прописанными в VGA BIOS. Нужно ли упоминать, что при просмотре утилиткой /usr/ports/sysutils/915resolution списка "зашитых" режимов, необходимых не обнаружилось?
В итоге встал перед выбором: либо исправлять драйвер i810, либо править BIOS. После прочтения массы материалов на этом сайте и форуме, остановился все же на втором, т.к. вопрос показался вполне решаемым.
Для генерации VGA BIOS для интеловских чипсетов с интегрированным графическим ядром применяется связка из Intel Embedded Graphics Drivers Configuration Editor (IEGD CED) и Open Watcom C/C++. Это ПО позволяет скомпилить бинарник VGA.BIN, который, как написано в официальном мануале, интегрируется в системный BIOS материнской платы. Но вот как его туда корректно интегрировать - Intel не сообщает. Рекомендует обращаться к производителю BIOS или MB. Несмотря на то, что партию контроллеров AEC-6910 мы покупаем большую, производитель ничего толком сказать не смог. Наверное, сам поразмещал OEM-заказы конторам-однодневкам... Пришлось вот лезть в инет и искать, как обойти алчных производителей)) Впрочем, это все лирика.
Практика же заключается в следующем: из материнки вытащен BIOS, при помощи вышеуказанного ПО сгенерирован VGA.BIN, теперь дело за малым - объединить
Вот что имеем:
C:\Award\CBROM>cbrom original.bin /d cbrom V1.55 [10/12/05 Release] (C)Phoenix Technologies 2001-2005 ******** original.bin BIOS component ******** No. Item-Name Original-Size Compressed-Size Original-File-Name ================================================================================ 0. System BIOS 20000h(128.00K) 13A16h(78.52K) 8150P15A.BIN 1. XGROUP CODE 0CC50h(51.08K) 08902h(34.25K) awardext.rom 2. ACPI table 03CDFh(15.22K) 01857h(6.08K) ACPITBL.BIN 3. EPA LOGO 0168Ch(5.64K) 0030Dh(0.76K) AwardBmp.bmp 4. YGROUP ROM 0C1B0h(48.42K) 04D2Ch(19.29K) awardeyt.rom 5. GROUP ROM[ 0] 04720h(17.78K) 02040h(8.06K) _EN_CODE.BIN 6. VGA ROM[1] 10000h(64.00K) 07DD4h(31.46K) MTG_3148.DAT 7. GROUP ROM[ 5] 01A00h(6.50K) 00C65h(3.10K) M09_3148.BIN 8. GV3 01CDDh(7.22K) 00B74h(2.86K) PPMINIT.ROM (SP) NCPUCODE 18800h(98.00K) 18800h(98.00K) NCPUCODE.BIN Total compress code space = 4B000h(300.00K) Total compressed code size = 46995h(282.40K) Remain compress code space = 0466Bh(17.60K) ** Micro Code Information ** Update ID CPUID | Update ID CPUID | Update ID CPUID | Update ID CPUID ------------------+--------------------+--------------------+------------------- SLOT1 01 0692 | SLOT1 02 0694 | SLOT1 45 0695 | SLOT1 07 0695 SLOT1 06 06D0 | SLOT1 09 06D1 | SLOT1 10 06D2 | SLOT1 17 06D6 SLOT1 20 06D8 | SLOT1 08 06E0 | SLOT1 0C 06E1 | PPGA 0C 06E1 SLOT1 26 06E4 | SLOT1 39 06E8 | PPGA 53 06EC | SLOT1 50 06EC SLOT1 01 0692 | SLOT1 02 0694 | SLOT1 45 0695 | SLOT1 07 0695 SLOT1 06 06D0 | SLOT1 09 06D1 | SLOT1 10 06D2 | 0000 000 0 0000 0000| 0000 0000| ^C
Вроде бы все красиво: только что сгенерированный VGA.BIN и несжатый VGA ROM (он же MTG_3148.DAT) имеют одинаковый размер - 64К, однако если глянуть на их внутреннюю структуру, то вылазят кое-какие несоответствия. Например, в "зашитом" в системный BIOS модуле часто встречаются plain-text сигнатуры производителя вроде "Интел инсайд" или "аллах акбар" (шутка), однако VGA.BIN никаких подобных "штучек" внутри не имеет - чисто бинарник, без всяких там стихов внутри. Из этого вылазит одна неприятность, из-за которой и стопорнулся: размер сжатого MTG_3148.DAT - 31.46K, а вот сгенерированный VGA.BIN сжимается при помощи LHA до 53К (сказываются различия в структуре). Генерировать пробовал много раз, с разными опциями - степень сжатия всегда оставалась порядка 84%, то есть результирующий размер сжатого файла при любых установках нового VGA BIOS оставался в пределах 53К.
Если присмотреться, то становится очевидным, что даже с учетом замены VGA ROM и удаления EPA и GV3 (кстати, не особо уверен, что его можно удалять) места на новый VGA ROM не хватит.
Кроме того, есть несколько вещей, которые смущают:
1. При перечислении Micro Code Information CBROM вываливается с ошибкой - к чему бы это? (ОС - WinXP SP2 со всеми обновлениями и исправлениями). CBROM версии 1.55, т.е. - последний, предыдущие версии вообще не видят NCPUCODE b некорректно определяют GV3, так что применять их смысла нет. Кстати, предыдущие версии и не перечисляют ничего...
2. При помощи CBROM невозможно ни извлечь, ни удалить NCPUCODE.
3. CBROM учитывает размер NCPUCODE в Total compressed code size при том, что NCPUCODE не сжат (рядом с именем модуля я не нашел характерных для lha заголовков, да и сам CBROM определяет этот модуль как non-compress cpu code.
4. Total compress code space составляет всего 300К, что как бы маловато для общего размера в 512К (4-Мб флешка). Ведь встречаются и 400К свободного места...
Собственно, вопросы, как всегда, очевидны: кто виноват и что делать?)) А если серьезно, то хотелось бы узнать - нет ли возможности каким-либо образом сжать NCPUCODE? Ведь места он занимает ооочень немало. Ну и может быть посоветуете, что можно безбоязненно выбросить из прошивки, чтобы на новый VGA ROM хватило места? У девайса есть несколько не особо нужных интегрированных устройств (PCMCIA, CF, watchdog и несколько последовательных портов, которые реализованы отдельными чипами, на них даже в BIOS Setup отдельная страничка выделена) - и ни одного явно предназначенного для них модуля!!!! То есть я даже не знаю, чего бы такого грохнуть... Может быть, есть еще какой-то способ увеличить доступное для записи модулей место, а то 300К смотрится смешно. И, до кучи, кроме VGA BIOS хотелось бы еще туда загнать LAN BOOTROM (вдохновился парой веток на форуме) - загрузка по сети в принципе нужна, но не реализована в существующей прошивке. Только вот место, место, место...
Добавлю, что флешка на маме - 49LF004A, установлена в колодку PLCC, так что заменить ее не составит труда, если угроблю. Правда, не на ходу - при разборке девайса камень и северный мост отрываются от корпуса-радиатора, следовательно при включенном девайсе до BIOS не добраться. Ну это мелочи - сделаю парочку копий (программатор и флешки имеются), так что экспериментов можно не бояться.
Заранее всем благодарен за помощь.
Hi!
Надеюсь что VGA.BIN создан по всем правилам и здесь вопросов не возникает.
Насчет сигнагур типа "аллах акбар" не ломайте голову, такое ощущение, что биосописатели накладывают готовый код на текстовый файл и поэтому проскакивают какие-то левые строки.
Сделайте два батника вида:
для разборки/очистки
для сборки
В бат-файле для сборки замените имя vga-биоса на свое и, ессно, он должен лежать в том-же каталоге.
В принципе все.
ЗЫ У меня с cbrom149. Конец микрокодов тоже не отрабатывает, но расбирает/собирает хорошо. Никто не ругается. На будущее - если будете пытать открывать свою прошивку в модбине, то переименуйте ее как-нибудь иначе, иначе все затрется.
Микрокоды можете затереть руками (если хотите, то оставьте один, нужный) до начала decompression bios (6EEC0h)
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
VGA.BIN создан утилитой производителя (то есть - Intel), по прилагаемым к ней инструкциям. Там и правда вопросов не возникает - BIN просто компилируется из исходников/
Так и делал. Сперва извлек все, что после VGA ROM, затем удалил GV3, group5 и VGA ROM. Проблема заключается в том, что после добавления VGA.BIN командой
cbrom.exe original.bin /vga VGA.BIN
получаем следующую картину:
То есть после добавления VGA ROM свободного места остается всего-то 1,21К при том, что для Group5 и GV3 нужно 5,96К. Именно в этом месте я и останавливаюсь, ибо не представляю себе, где можно выцепить дополнительное место, которого не хватает.
Только что попробовал им всесто 1.55 - эффект тот же, чего и следовало ожидать.
В принципе, если поглядеть на NCPUCODE (я так понимаю, что Micro Code Information как раз и отображает содержимое этой части), то можно увидеть кучу всякой лабуды. Такое ощущение, что это какой-то референсный список всех интеловских камней, которые тут и даром не нужны. Ну на кой черт мне CPUID для процессоров под SLOT1? Может быть, можно как-то покоцать эту часть? Например, оставив там только коды для Pentium M / Celeron M (именно такие процессоры стоят в линейке данных агрегатов).
О-о, вот за этот совет спасибо огромное, попробую. Только есть вопросик один - не указывается ли по какому-то смещению длина NCPUCODE, или же она автоматически высчитывается как разница между смещением начала NCPUCODE и decompression bios?
Давайте сначала разберемся с размерами видеобиос. У Вас и в первом случае и во втором размеры vga одинаковые - по 64 Кб. Куда девается остальное место?
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
Прошу прощения, немного не понял сути вопроса. Что значит - куда девается? Размер несжатого VGA ROM для Intel Embedded Graphic на i855GME должен составлять 64КБ. То есть после того, как в памяти сжатый образ распаковывается, его размер должен составлять именно 64КБ. При интеграции в BIOS файл VGA ROM сжимается по алгоритму LHA. И компрессия для VGA.BIN, собранных (говорю во множественном числе, ибо пробовал много раз) интеловской утилитой, составляет порядка 84%. Вот, собственно, и все.
Упс, sorry, зациклился на второй колонке.
Размер блока микрокодов должен находится где-то рядом с сигнатурой NCPUCODE.
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
Вот понимаю это спинным мозгом, но найти не могу. CBROM показывает размер 18800h, но я пока не нашел, откуда он его вытащил. Кроме того, мне пока не сиьлно понятно, где же начинается этот блок. Наверное, надо брать бумажку и начинать считать от начала GV3.
И еще - не могу понять, структуру NCPUCODE (если решусь его править). Вроде бы этот блок не сжат, но описания формата я явно не прослеживаю (дилетант), и описания пока не нашел. Если структуры lh5-блоков достаточно хорошо документированы, то с NCPUCODE как-то все не так радостно, несмотря на то, что используется он, как я понимаю, практически повсеместно. Извлекать его придется ручками, какой именно кусок извлекать - пока не понял. На паре буржуйских форумов есть упоминание о том, что кто-то правил этот NCPUCODE.BIN и зашивал его обратно, но без технических подробностей. может быть, здесь кто-то имеет подобный опыт?
У вас микрокоды начинаются с адреса 527Е0h
01 00 00 00 01 00 00 00 02 20 20 06 92 06 00 00
где-то тут версия, дата, степпинг процессора - 0692h.Конец находится по адресу 6AFEFh. Если взять адрес начала строки 6AFE0h то разница как раз 18800h. Чуть ниже, после *ALIN16* стоит именно длина блока 00 88 01.
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
Santa, спасибо за помошь! Все верно, блок там и находится.
Более того, я тут почитал документик один интересный: IA-32 Intel® Architecture Software Developer’s Manual. Volume 3: System Programming Guide. Так вот, в нем в разделе 9.1.11 написано, что размер блока данных микрокода - 2КБ. Действительно, если от смещения 527Е0h отсчитать 800h (2КБ), то попадаем на смещение 52FE0h, в котором описывается следующий микрокод с CPUID=0694h !!! Причем, в этом руководстве дана даже структура этого блока, что существенно облегчает задачу выделения нужных микрокодов. Теперь бы еще табличку соответствий CPUID реальным процессорам вытащить... Или просто глянуть, какой CPUID у моего экземпляра...
Та-а-ак, вот это дело нужно отметить!) Пойду хлопну рюмку чая) Оказывается, это чертовски увлекательное занятие - ковыряние в BIOS'е)) Мне уже hiew снился сегодня, а по дороге с обеда поймал себя на том, что я эти чертовы смещения в уме прокручиваю
P.S. на стр.413 вышеозначенного руководства указано, что для некоторых типов процессоров необходимо выделять 8 блоков по 2КБ на микрокод, что следует учитывать при правке NCPUCODE.BIN. Кстати, возможно, что именно по этой причине и вылетает CBROM - не умеет подобную ситуацию обрабатывать. Составлю карту этого файлика - проверю предположение.
P.P.S. Выяснил, что блоки по 2 КБ - это прошлый век. Некоторые блоки могут иметь отличную от 800h длину - нужно проверять по смещениям 1Ch-1Fh каждого блока размер контейнера с данными, прибавлять 30h и получать общий размер контейнера, отталкиваясь от которого, находить следующий. Ничего сложного, в принципе, нет. Написать, что ли, утилиту?
Вы их (микрокоды) можете пока удалить как класс. После отладки готового БИОСа сможете вставить их обратно. На функционирование это не влияет.
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
Советую перед засовыванием в BIOS VideoBIOS проверить работает ли он? Как это сделать - найти утилиту RAMBIOS (есть на radeon2.ru и на mvktech.net). Запустить ДОС (7.10 от Windows 98). В нём дать команду rambios.com /i [файл VideoBIOS]. После запустить Windows 98 командой win.com. Если нет 98, есть второй вариант - с программой TweakBios в своё время поставлялся маленький exe int19.exe он делает быстрый перезапуск. То есть к примеру ДОС с дискеты запустили, rambios запустили, int19 в нём и вперёд с винта XP. Проверили - если работает, то тогда
cbrom (можно любой не обязательно самый новый 2,07 вполне корректно засовывает VGA),
cbrom [BIOS mb] /vga vga.rom
cbrom [BIOS mb] /btvga vga.rom
BTVGA - не помню. но на некоторых матерях в bios содержалось много видеобиос, не факт что ваш будет первым.
Добавлено спустя 7 минут 25 секунд:
Без микрокодов должно запуститься - правда при старте напишет типа Unknown CPU. Но это не смертельнолибо можете взять вынуть его командой extract и засунуть командой /cpucode оно их пожмёт и работать всё равно будет.
Дрессируем коров
Отправить комментарий