差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
cpp:pci:scan_pci [2013/02/24 22:45] tony |
cpp:pci:scan_pci [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 3: | 行 3: | ||
之前因為修bug,有接觸到與PCI有關的Code,我用容易懂的方式把它紀錄下來。並以一個簡單的範例來教導大家如何去存取PCI Device。 | 之前因為修bug,有接觸到與PCI有關的Code,我用容易懂的方式把它紀錄下來。並以一個簡單的範例來教導大家如何去存取PCI Device。 | ||
===== 原理 ===== | ===== 原理 ===== | ||
- | 根據PCI Spec(我沒翻過),我們可以透過0xfc8(index register)設定要讀取的位置,設定完之後透過0xcfc(data register)去取得資料。\\ | + | 根據PCI Spec(我沒翻過),我們可以透過0xcf8(index register)設定要讀取的位置,設定完之後透過0xcfc(data register)去取得資料。\\ |
要設定給0xfc8的位置,擁有以下意義:\\ | 要設定給0xfc8的位置,擁有以下意義:\\ | ||
<code> | <code> | ||
行 21: | 行 21: | ||
根據[[http://www.intel.com/content/dam/doc/datasheet/io-controller-hub-10-family-datasheet.pdf|ICH10 Spec]], | 根據[[http://www.intel.com/content/dam/doc/datasheet/io-controller-hub-10-family-datasheet.pdf|ICH10 Spec]], | ||
GPIO Base Address在LPC Interface Bridge Registers中,LPC在Bus=0,Devices=31,Fun=0的位置,也就是0x8000F800。 | GPIO Base Address在LPC Interface Bridge Registers中,LPC在Bus=0,Devices=31,Fun=0的位置,也就是0x8000F800。 | ||
- | 而儲存GPIO Base Address在0x8000F800+0x48的位置。因此首先設定0xfc8為0x8000F800+0x48,接著再從0xcfc讀值出來。\\ | + | 而儲存GPIO Base Address在0x8000F800+0x48的位置。因此首先設定0xcf8為0x8000F800+0x48,接著再從0xcfc讀值出來。\\ |
在Linux下可以這樣做: | 在Linux下可以這樣做: | ||
<code cpp> | <code cpp> | ||
- | unsigned long index_reg_addr = 0xfc8; | + | unsigned long index_reg_addr = 0xcf8; |
unsigned long data_reg_addr = 0xcfc; | unsigned long data_reg_addr = 0xcfc; | ||
// Set address to pci configuration space | // Set address to pci configuration space |