1. 程式人生 > >PCI子系統(二)- pci controller driver

PCI子系統(二)- pci controller driver

訪問PCI配置空間

通過8位,16位,32位的資料傳輸訪問配置空間,where是從配置空間起始位置計算的位元組偏移量。

static inline int pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val)
static inline int pci_read_config_word(const struct pci_dev *dev, int where, u16 *val)
static inline int pci_read_config_dword(const struct pci_dev *dev, int where, u32 *val)

static inline int pci_write_config_byte(const struct pci_dev *dev, int where, u8 val)
static inline int pci_write_config_word(const struct pci_dev *dev, int where, u16 val)
static inline int pci_write_config_dword(const struct pci_dev *dev, int where, u32 val)

訪問PCI裝置的I/O空間或者記憶體空間

一個PCI裝置可以有多達6個基址暫存器,可以是記憶體地址,也可以是I/O地址。
可以通過pci_resource_start(dev, bar)函式獲得PCI裝置的基址暫存器的實體地址,然後通過ioremap函式將該區域的實體地址對映為虛擬地址。


linux中MSI的相關函式

#define pci_enable_msi(pdev)    pci_enable_msi_exact(pdev, 1)    //啟用MSI並分配給裝置一箇中斷
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);    //允許驅動申請minvec至maxvec箇中斷
int pci_msi_vec_count(struct pci_dev *dev);    //獲取裝置申請的中斷向量個數
void pci_disable_msi(struct pci_dev *dev);    //禁用MSI,回退到基於中斷引腳的中斷響應方式