PCI子系统(二)- pci controller driver

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luckywang1103/article/details/85934831

访问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,回退到基于中断引脚的中断响应方式

猜你喜欢

转载自blog.csdn.net/luckywang1103/article/details/85934831
PCI