Smyg11
Full Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Цитата: Для доступа к шине PCI используется 2 порта 0CF8 и 0CFC. Оба этих порта имеют размер 32 бита (DWORD) Порт 0CF8, сновной функцией этого регистра является - выбор определённого регистра конф. пространства одного из устройств на одной из шин PCI Его формат 0-1 не используется, потому что размер регистра 32 бита 2-7 Номер регистра в пространстве PCI-устройства 8-10 Номер функции устройства (для многофункциональных устройств) 11-15 Номер устройства 16-23 Номер шины 24-30 не используется 31 Всегда должен быть равен 1!! После выбора конкретного регистра из него можно читать и в некоторые писать, для этого нужен порт 0CFC, он и является отображением данных того выбранного регистра, операции ВСЕГДА ведуться ТОЛЬКО с 32 битными словами Для начала нам нужно выяснить что за производитель у нашей матери мост всегда находится по адресу $80000000 пример: PortDWordOut 0CF8 ,$80000000 Brifge:=PortDWordIn 0CFC мы получили нулевой регистр северного моста, нулевой регистр состоит из двух слов младшее слово это Vendor, старшее слово это Device описание можно взять здесь http://rh-software.com/downloads/pcidevs.zip для VIA вендор 1106 для Intel вендор 8086 итак мы знаем производителя нашей матери теперь нам надо узнать где находиться IDE контроллер для этого мы сканируем PCI-шину для поиска знакомых IDE-контроллеров (ищем знакомый Device уже известного Venodra) for bus:=0 to $ff do for dev:=0 to $1f do for func:=0 to 7 do begin io_cf8:=$80000000+(bus shl 16)+(dev shl 11)+(func shl 8); PortDWordOut($CF8,io_cf8); io_cfc:=PortDWordIn($CFC); if (io_cfc and $0000FFFF)=VID then begin Name:=GetIDEName(HIWORD(io_cfc)); if Name<>'Unknown device' then begin Result:=true; Conf:=io_cf8; exit; end; end; end; нашли наш IDE-контроллер и запомнили его адрес |
| Всего записей: 531 | Зарегистр. 29-03-2016 | Отправлено: 15:44 18-10-2016 | Исправлено: Smyg11, 14:10 19-10-2016 |
|