OSDev Wiki
(Добавление категорий)
Метка: categoryselect
(Добавление категорий)
Метка: categoryselect
Строка 34: Строка 34:
 
ret
 
ret
 
[[Категория:Мультизагрузка: Практическая реализация ядра с поддержкой Multiboot]]
 
[[Категория:Мультизагрузка: Практическая реализация ядра с поддержкой Multiboot]]
  +
[[Категория:Архитектура ARM]]

Версия от 13:30, 18 августа 2015

PCI-устройство всегда имеет номер шины и номер слота, может иметь одну или несколько функций. У функции есть отдельное конфигурационное пространство состоящее из регистров (см. Конфигурирование устройств PCI). Следующий код есть метод считывания одного регистра конфигурационного пространства.

;---------------------------------------------------------
; Метод: ushort(AX) Config.ReadWord(byte Bus(BL), byte Slot(BH), byte Func(CL), byte Register(CH));
; Описание: Прочитать содержимое конфигурационного регистра (16 бит) функции PCI-устройства.
;	Bus – номер шины PCI [0..255].
;	Slot – номер слота (устройства) [0…31].
;	Func – номер функции [0..7].
;	Register – номер конфигурационного регистра.
;---------------------------------------------------------
BeginMethod: ;EAX = bus << 16 movzx eax,bl shl eax,16
;EAX |= slot << 11 movzx esi,bh shl esi,11 or eax,esi
;EAX |= func << 8 movzx esi,cl shl esi,8 or eax,esi
;EAX |= Register << 2 shl ch,2 movzx esi,ch or eax,esi
;EAX |= 0x80000000 or eax,0x80000000
;записываем EAX в CONFIG_ADDRESS mov dx,0xCF8 out dx,eax
;читаем из CONFIG_DATA в AX mov dx,0xCFC in ax,dx ;in eax,dx ret