PCI子系統(二)- pci controller driver
阿新 • • 發佈:2019-01-11
訪問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,回退到基於中斷引腳的中斷響應方式