1. 程式人生 > 其它 >PCI配置空間讀取

PCI配置空間讀取

技術標籤:PCI其他pci-e

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

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