天天看點

PCI配置空間讀取

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

PCI配置空間讀取

    1.拼湊出32位位址

    bus有8位,dev有5位,fun有3位,最高位bit位為使能。

PCI配置空間讀取

   最高位要置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
           

繼續閱讀