Попалась вот в руки экзотика на чипсете NEC
Производитель материнки Eagles
Описывать не буду, уже подробно описывали - она на форуме уже попадалась
rom.by/phpBB2/viewtopic.php?p=13120
и вот здесь поругали её BIOS
rom.by/phpBB2/viewtopic.php?t=5123
Проблема в какой-то индивидуальной непереносимости к видеокарте Asus V3000 (Riva128) PCI
Если вставить ISA видеокарту то материнка стартует и грузится ОС
Если же поставить PCI то выдает ошибку видео (8 коротких пиков спикера)
Причем как мне кажется проблема конкретно с этой видеокартой, если порыть интрнет то у людей с другими PCI картами работает
Сначала думал что есть несовместимость версий PCI - на видео то она PCI 2.1 а на материнке хрен знает, но если загрузиться при вставленной ISA и PCI то операционка распознает её корректно и проблема остается лишь в конфликте 2х видеокарт
Тоесть получается контроллер PCI работает и видеокарта работает, но POST с ней проходить BIOS не желает
BIOS у материнки собственный, меню нестандартное, словами не передать
Все что по теме (настройки контроллера в том числе и Assign IRQ for PCI VGA) уже перепробовал
Вот теперь надо решить вопрос кто виноват
Либо BIOS материнки не находит видео
Либо BIOS видеокарты особенный и не хочет подгружаться
В любом случае проблему надо решить одну - чтобы до ОС увидела видеокарту PCI как единственную
Либо нужно исправлять несовместимость и заставить видео проходить POST
Либо заставить пройти POST с ошибкой, чтобы ОС при загрузке подцепила видеокарту (на другой материнке если из видео вытащить флешку то POST пройдет с ошиибкой и пойдет дальше, а когда очередь дойдет до ОС она уже сама её проинициализирует)
Сейчас при ошибке POST останавливается и дальще грузить систему не хочет, что при этом он пишет к сожалению не увидишь
Поменять видеокарту не могу - именна эта нужна
Поменять материнку тем более - её приемущества в том что она очень маленькая (21х16), и в полном обвесе (MB, P1-166, 32MB SDRAM, Video, HDD) требует только +5V при этом ничего не греется и потребляет при этом всего 6Вт - такого больше не найти!
Помогите советом плиз, очень уж хочется поднять, итак уже с того света её вытащил (битый ШИМ, раскачка, мосфеты, отломанная панелька)
----------------------------------------------------
Расковырял обработку устройств на шине
Базовый цикл:
Вот сама обработка
Вроде ничего подозрительного.....
Рассаматривал процедуры GO_IO, GO_MEM и GO_ROM - принцип ясен, непонятны детали
Кажется есть какой-то криминал
Кто может, прошу оказать помощи:
1) Как устройство в одном BAR заявляет и базовый адрес памяти и его размер? Целый час перечитывал абзац в спецификации - не понял
Понятно что записав все 111 мы можем по оставшимся 0 определить размер, но как определить нужный адрес памяти? (Пример - видео, адрес 000A0000)
2) COPYROM все-таки вызывается, поэтому всплывает прошлый вопрос - про порты E0, E1 и непривычный механизм копирования
Если кто знает - подскажите пожалуйста, нигде не найду инфу
Заранее благодарен
Прошу прощения, но вызов ROMSCAN может и не произойти?
Открытая книга: icbook.com.ua
icbook Спасибо что отозвались
Меня сейчас ROMSCAN как таковой пока не интересует
Проблема появляется ещё раньше - после посткода 13 идет обозначенный мною "Базовый цикл" по перечислению устройств на PCI шине
Вызывается Add_Device, натыкается на видеокарту, инициализирует ConfigSpace выдеокарты и, самое интересное, вызывается ROMCOPY которвй, как я понял, что то делает с чипсетом и появляется возможность стянуть из видеокарты ROM в основную память
Я вставлял повсюду отладочные куски
Вот как проходит код
1) Видеокарта находится - есть переход по проверке КлассаУстройства
2) Есть проход по секциям инициализации BAR,ROM,INT,MEM,IO (сами процедуры типа GO_XXXX я еще не дебагил)
3) Есть запись в ControlRegister и далее следующий за ним вызов COPYROM
Далее в COPYROM на первой же проверке
(эта та которая у меня
cmp word ptr [bx], AA55 Проверяем сигнатуру
jne SIG_ERR Неверная сигнатура - выход
)
вываливаемся - тоесть не находим сигнатуру
Вот принципиальная проблема "слепоты" биос - он не имеет доступ к Видео-ROM
Мне кажется что проблема в неправильной инициализации регисров BAR и регистра ROM видеокарты
Сейчас я выложу их код (GO_MEM и GO_ROM) но сам я его понять не могу - читал спецификацию PCI и в инглише и на русском и версии 2.0 и версии 2.2
НИКАК не могу понять механизм выделения памяти !
Записав все 11111 в регистр и считав его содержимое можно узнать размер требуемой памяти, но КАК определить адрес?? Пример - видеопамять 000A0000-000AFFFF всегда именно такая
Вот засада то!
Я уже заканчиваю свою мини прогу по полной расшифровке ConfigSpace включая полный анализ BAR
Только так на практике я смогу порнять механизм
А пока - увы
GO_MEM
примечание - переменная [3C5C] по умолчанию = E0000000
GO_ROM
примечание - переменная [si], по умолчанию = 000C0000
Далее в COPYROM на первой же проверке ... вываливаемся - тоесть не находим сигнатуру
Посмотрю в свободное время.
Открытая книга: icbook.com.ua
Закончил я писать программу и провел, так сказать, анализ.
Результаты меня привели в некоторое замешательство.
Начал еще раз перечитывать спецификацию PCI.
Перечитав Appendix D - Device Class Codes, я понял что никаких фиксированных адресов PCI плате выделяться не может.
По анализам BAR биос может только узнать размер области, необходимой устройству. При этом выбор адреса этой области лежит целиком на биос.
Как оказалось, просто некоторым устройствам стандартного типа (видео например) далжна выделяться область с определенным базовым адресом.
В спецификации прописано что если код класса - 030000, то как видеокарте, устройству полагается память A0000-BFFFF и I\O 3B0-3BB, 3C0-3DF.
Я этого не знал, и полагал что видеокарта должна сама заявлять об требуемых ей ресурсах в BAR. На самом деле в BAR только дополнительная памать.
Теперь о самой видеокарте asus.
Она использует только BAR0 и BAR1, требуя в каждом из них по 16Мб памяти.
Плюс используется BAR-eROM, требующий 4(!) мегабайта под ROM.
Биос платы NEC выделяет ей пространство E0000000-E0FFFFFF и E1000000-E1FFFFFF под память.
Какой адрес выделяется ROM я не знаю - после COPYROM он сброшен в 0.
Но посмотрев в код, можно посчитать, что выделяется пространство 000C0000 - 004C0000 что в принципе странно, хотя работать должно.
Теперь даже не знаю где может быть косяк.....
Добавлено спустя 10 минут 29 секунд:
Посмотрел, как выделяется на плате с чипсетом VIA - то же самое.
E2000000-E2FFFFFF
E3000000-E3FFFFFF
ROM=0
Отправить комментарий