PCI配置空間讀取
阿新 • • 發佈:2021-02-15
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
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的配置空間,
2.使用0xCF8和0xCF9埠(0xCF8寫入地址,0xCF9讀取/修改數值)
如果要讀取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