(Добавление категорий) Метка: 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