提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔
PCI配置空間讀取
1.拼湊出32位位址
bus有8位,dev有5位,fun有3位,最高位bit位為使能。
最高位要置1,也就是bit31置1,bit23 ~ 16是寫入Bus Number,bit15 ~ 11是Device Number,bit10 ~8是寫入Function Number.
如果要通路PCI裝置中BUS Number為00,Device Number 為1Fh,Function Number為04的配置空間,
則32位位址應該是 1 XXXXXXX 00000000 11111 100 XXXXXX 00 以4bit為機關,則是 1XXX XXXX 0000 0000 1111 1100 XXXX XX00
2.使用0xCF8和0xCF9端口(0xCF8寫入位址,0xCF9讀取/修改數值)
把拼湊出的32bit位址,寫入0xCF8端口中。 然後從0xCF9端口中讀取出data。
如果要讀取BUS Number為00,Device Number 為1Fh,
Function Number為04,Register Number 為04的數值
用C語言拼湊出32bit的位址,則:
WORD Enable = 1;
WORD Bus = 00;
WORD Dev= 0x1F;
WORD Fun= 04;
WORD Reg = 04;
DWORD Addr = (Enable<<31) | (Bus << 16) | (Dev<< 11) | (Fun<< 8) | (Reg); //32bit位址
用彙編實作,代碼如下:
cli
xor eax,eax
xor ebx,ebx
;enable
mov eax,1h
shl eax,31
;bus number
mov ebx,0
and ebx,0ffh
shl ebx,16
add eax,ebx
;device number
xor ebx,ebx
mov ebx,0x1F
and ebx,0ffh
shl ebx,11
add eax,ebx
;function number
xor ebx,ebx
mov ebx,4
and ebx,0ffh
shl ebx,8
add eax,ebx
;register
xor ebx,ebx
mov ebx,4
and ebx,0ffh
add eax,ebx
;read
mov dx,0cf8h
out dx,eax
mov dx,0cfch
in eax,dx