[an error occurred while processing this directive]
|
Понадобилось считать с "чужой" карточки информацию записываемую драйвером в ее регистры.
Вытащил старый ассемблерный макрос, переписал под Delphi, и обнаружил что несколько отстал от жизни.
Вот макрос:
"data:=$80000000 or (bus shl 16) or ((dev and $1F) shl 11)
or ((func and 07) shl 8) or (reg and $0FC);"
Раньше(пару лет назад) на мой взгляд архитектура была стандартной и понятной.
Единичка в старшем бите говорила о том что идет обращение собственно к устройствам а не к мостам PCI/PCI.
Шина(bus) 0 - собственно основной мост CPU-PCI на котором сидели устройства(dev) с одной или несколькими функциями(func).
Шина 1 это AGP порт.
Написал программу сканирования шин от 0 до 16, не сканировать же 7FFF шин :-).
И получил вот такие результаты на плате i815:
Bus=00, Dev=00, Func=00, DiD/ViD=11308086
Bus=00, Dev=02, Func=00, DiD/ViD=11328086
Bus=00, Dev=1E, Func=00, DiD/ViD=244E8086
Bus=00, Dev=1F, Func=00, DiD/ViD=24408086
Bus=00, Dev=1F, Func=01, DiD/ViD=244B8086
Bus=00, Dev=1F, Func=02, DiD/ViD=24428086
Bus=00, Dev=1F, Func=04, DiD/ViD=24448086
Bus=00, Dev=1F, Func=05, DiD/ViD=24458086
Bus=01, Dev=00, Func=00, DiD/ViD=813910EC
Bus=01, Dev=00, Func=01, DiD/ViD=813910EC
Bus=01, Dev=00, Func=02, DiD/ViD=813910EC
Bus=01, Dev=00, Func=03, DiD/ViD=813910EC
Bus=01, Dev=00, Func=04, DiD/ViD=813910EC
Bus=01, Dev=00, Func=05, DiD/ViD=813910EC
Bus=01, Dev=00, Func=06, DiD/ViD=813910EC
Bus=01, Dev=00, Func=07, DiD/ViD=813910EC
Интересующая меня плата попала на шину 1 и не-корректно на мой взгляд откликается на смену номера функции.
Можно ли из этого построить правило:"Если DiD/ViD у функций 0 и 1 совпадают - то это одно устройство."?
И второй вопрос как корректно останавливать перебор шин?
Спасибо.
E-mail: info@telesys.ru