PCI子系统(二)- pci controller driver

本文介绍了通过不同位宽访问PCI配置空间的方法,包括读写配置空间的内联函数,并阐述了如何通过基址寄存器访问PCI设备的I/O或内存空间。此外,还详细解释了Linux中MSI(消息信号中断)的使用,包括启用、禁用及查询MSI的相关函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值