Page 1 of 1

Вопрос по pci

Posted: Wed Jun 01, 2005 8:10 pm
by cyberGnom
помогите пожалуста разобраться с pci:

пусть в eax имеется маска формата
[ 1000 0000 . bbbb bbbb . dddd dfff . 0000 0000 ]
где b = bus - номер шины
d = device
f = function
т.е. номер pci регистра = 0
все три парасметра перебираются в цикле...цикл работает, маска тоже верна,
сомнение вызывает код:

Code: Select all

mov   dx,   0xcf8
out   dx,   eax
	      
mov   dx,   0xcfc
in    eax,  dx
на выходе в eax ысегда 0xffff ffff
при любых bus:device:function... то есть не находит не одно устройство.... :mrgreen:

Posted: Thu Jun 02, 2005 12:29 pm
by VaStaNi
Привет!
Голову ты бы себе не морочил с такими изысканиями... такие вещи надо изучить, а потом ваять, а не тыкать пальцем в небо. ТОлько в MeOS несколько кусков исходника посвящены PCI..., я уже как то говорил про кусок отвечающий за Ethernet как пример...
Ладно, держи готовую прогу COM вида под ДОС, которая выуживает PCI устройства. Все проверено, выверено и сравнено с... массой других.... по ReadPCI. Тебе осталось только проглотить :)


org 0x100

call cls
xor bx, bx ; BH = bus, BL = device
xor cx, cx ; CH = function, CL = register
@nextReadPCI:
call ReadPCI
cmp eax, 0xFFFFFFFF
je @nextElementPCI
call device_found
@nextElementPCI:
inc ch ; б«Ґ¤гой п дг­ЄжЁп нв®Ј® гбва®©бвў  PCI
cmp ch, 8
jne @nextReadPCI
xor ch, ch

inc bl ; б«Ґ¤го饥 гбва®©бвў® PCI ­  н⮬ б®ЄҐвҐ
cmp bl, 32
jne @nextReadPCI
xor bl, bl

inc bh ; б«Ґ¤гойЁ© б®ЄҐв PCI
cmp bh, 255 ;
jne @nextReadPCI

call @cls
int 0x20



device_found:
pusha
mov si, PCIbusTxt
call prtString
popa
pusha
mov al, bh
call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
mov si, PCIdevTxt
call prtString
popa
pusha
mov al, bl
call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
mov si, PCIfunTxt
call prtString
popa
pusha
mov al, ch
call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
mov si, PCIregTxt
call prtString
popa
pusha
mov al, cl
call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
inc [ScreenString]
mov [ScreenColumn], 0
mov si, PCIvendorTxt
call prtString
popa
pusha
call ShowHexWord ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
inc [ScreenString]
mov [ScreenColumn], 0
mov si, PCIdeviceTxt
call prtString
popa
pusha
shr eax, 16
call ShowHexWord ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
mov [ScreenColumn], 0
add [ScreenString], 2
cmp [ScreenString], 24
jc @nnn
call @cls
@nnn: popa
RET



ReadPCI:
; BH - bus, BL - device, CH - function, CL - register
xor eax, eax
mov al, bh
or ah, 0x80
shl eax, 16
mov ah, bl
shl ah, 3
or ah, ch
mov al, cl
and al, 0xFC
mov dx, 0x0CF8
out dx, eax
mov dl, 0xFC
in eax, dx
RET


PCIbusTxt DB "PCI bus: ", 0
PCIdevTxt DB " device: ", 0
PCIfunTxt DB " function: ", 0
PCIregTxt DB " register: ", 0
PCIvendorTxt DB "Vendor code: ", 0
PCIdeviceTxt DB "Device code: ", 0


INCLUDE 'CVSTRING.INC'

Posted: Thu Jun 02, 2005 12:37 pm
by VaStaNi
А вообще сейчас в ступени 1 АТОМ ОС я применяю следующее...
Более прозрачно, понятно и оптимально, с "моей колокольни".

PCI_CFG_ADDR = 0x0CF8

WriteIdxPCI:
; BH - bus, BL - dev, CH - func, CL - register
push eax
xor eax, eax
mov al, bh
or ah, 0x80
shl eax, 16
mov ah, bl
shl ah, 3
or ah, ch
mov al, cl
and al, 0xFC
mov dx, PCI_CFG_ADDR
out dx, eax
mov dl, 0xFC
or dl, cl
pop eax
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SetCfgSpaceDword:
push dx
call WriteIdxPCI
out dx, eax ;write dword
pop dx
RET
SetCfgSpaceWord:
push dx
call WriteIdxPCI
out dx, ax ;write word
pop dx
RET
SetCfgSpaceByte:
push dx
call WriteIdxPCI
or dl, cl
out dx, al ;write byte
pop dx
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GetCfgSpaceDword:
push dx
call WriteIdxPCI
in eax, dx ;read dword
pop dx
RET
GetCfgSpaceWord:
push dx
call WriteIdxPCI
in ax, dx ;read word
pop dx
RET
GetCfgSpaceByte:
push dx
call WriteIdxPCI
in al, dx ;read byte
pop dx
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Успехов PCI`ях! ;)

Posted: Thu Jun 09, 2005 3:20 pm
by cyberGnom
очень странно: я пробовал даже тупо копировать твой код: НЕ РАБОТАЕТ :shock:
вероятно у меня тоже все было написано правильно.... есть мысли? :cry:

Posted: Fri Jun 10, 2005 9:44 am
by VaStaNi
Мыслей вогон и маленькая тележка. Идей тоже.... Тебе какую?
Программирование любит АБСОЛЮТНУЮ конкретику и точность, а в твоем вопросе сего нет.
Я тебе дал проверенное и опробованное и .... и конкретно, между прочим. Т.к. указал главное - среду, где живёт код. А ведь сказал ДОС. И это незря. Именно ДОС а не какое то там виртуальное и ли еще какое посредниковое детище. ДОС максимально близок к железу и реалиям жизни аппарата! Он без всяких проволочек и принципов(защита и пр.) позволяет пощупать и попробовать и отладить и выловить, особенно, подчеркиваю, ОСОБЕННО при работе с портами! Т.е. такие темы и темы реальных драйверов, я, как впрочем и многие другие реально мыслящие кодеры железа строгают там...
Предполагаю, что у тебя рубит "среда". Наверное в PM юзаешь, а политика безопасности и доступа к портам... того... посылает тебя. Или нечно вроде этого. Ищи, думай. Почву я тебе для этого дал, считаю. Успехов!