Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2011, 22:22   #1
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
Вопрос Чтение регистров конфигурационного блока устройства PCI

Для устройств PCI необходимо прочитать содержимое регистров Vendor ID, Device ID, Revision ID,Class ID и т.д.
Сначала в порт CONFIG_ADDRESS (0x0CF8) записал 32-разрядный адрес регистра.. адрес вроде как разбирается мостом.. Проверил порт CONFIG_DATA (0x0CFC) на возвращение значения 0x0FFFFFFFF (случай чтения конфиг. регистра несуществующего устройства).
Код:
__asm
{
	mov dx,0CF8h
	mov eax,curAddr //32-битный адрес
	out dx,eax

	mov dx,0CFCh
	in eax,dx
	mov result,eax //смотрим результат, так же 4 байта
}

Как я понял, доступ к конфигурационным блокам осуществляется по неким циклам шины configuration read, configuration write.
Вот с этим-то и возникли сложности из-за непонимания матчасти.. погуглил, почитал, все равно не въехал..
Каким же образом можно прочитать содержимое регистров конфигурационного блока устройства PCI?
p.s. виндус, ms visual studio
Удел сильных - уделывать слабых
Napkin вне форума Ответить с цитированием
Старый 19.02.2011, 10:52   #2
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию

Как оказалось, всё чертовски просто. Скажу пару слов по этому вопросу, может кому пригодится.
В порт CONFIG_ADDRESS мы записываем 32-разрядный адрес. Формат:
10000000 | номер шины | номер устр-ва | номер функции | 00000000
если адрес верный, прочитав порт 0x0CFC, мы обнаруживаем некое значение, отличное от 0x0FFFFFFFF (все единицы). Далее для того, чтобы узнать DeviceID, VendorID, Status и т.д. мы просто в младшие 8 бит записываем необходимое нам смещение (указано в таблице выше). К примеру:
10000000 | номер шины | номер устр-ва | номер функции | 00001000 - смещение 8
Теперь посылаем эту бороду в порт 0x0CF8, и имеем в 0x0CFC 32-битное значение, находящееся по смещение 0х08 (ClassID + RevisionID).
Соответственно, чтобы получить ClassID - выделяем старшие 24 бита, для RevisionID - младшие 8 бит.
Таки дела.
Удел сильных - уделывать слабых
Napkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Содержимое регистров maxwelldream Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 15.01.2011 09:28
Инициализация теневых регистров kot111 Помощь студентам 0 03.11.2009 16:58
состояние регистров клавиатуры olen` Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 05.06.2009 22:34
PCI. Чтение множества данных подряд Min Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 07.04.2009 03:40
много регистров nntpaha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.12.2007 19:01