PCI / PCIe设备如何在Linux内核中初始化/注册自己?
作者:互联网
当内核启动时,PCI子系统为每个物理PCI总线创建一个pci_bus,然后将pci_bus添加到pci_root_buses(具有PCI配置).但是PCI设备驱动程序通过pci_register_driver注册驱动程序,并将PCI驱动程序添加到pci_bus_type.
我的问题:
> pci_bus_type如何知道PCI配置.
> pci_bus_type和pci_root_buses之间是什么关系.
解决方法:
由于问题部分不完整,但是评论太小而无法给出答案,我将尝试将其混为一谈.
因此,内核尝试从驱动程序开发人员中提取PCI(e)总线的物理实现.因此,NVidia Tegra上的PCI总线与飞思卡尔ARM和x86_64 PCI总线上的PCI总线不同,但是无论实际的总线实现如何,都应该可以针对它们注册设备.
pci_root_buses结构是抽象PCI总线的列表,其中的实现可能有所不同.
您可以在总线类型结构中看到这一点,在该结构中定义了函数指针,以允许每个实际总线具有不同的实现如何处理设备.我认为最好阅读PCI chapter in LDD3并特别关注启动时间.
还要查看“配置时间”,以了解内核如何将驱动程序与硬件进行匹配. PCI的粗略概念是内核可以发现总线并将内存映射到每个物理PCI设备,从而可以访问设备的PCI配置空间.驱动程序开发人员通过调用pci_register_driver并因此告诉内核哪些驱动程序函数用于某些供应商ID来注册设备类.
再次查看LDD3,似乎您可能正在寻找的缺少的映射是probe函数:
int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);
指向PCI驱动程序中探针功能的指针.当PCI内核具有它认为该驱动程序想要控制的结构pci_dev时,便会调用此函数.指向PCI内核用来做出此决定的struct pci_device_id的指针也传递给此函数.如果PCI驱动程序声明传递给它的struct pci_dev,则应正确初始化设备并返回0.如果驱动程序不想声明该设备或发生错误,则应返回负错误值.有关此功能的更多详细信息,将在本章后面介绍.
内核数据结构
> Bus type
进一步阅读
> Linux Device Drivers 3rd edition – Chapter PCI
> In Kernel Documentation about PCIe
标签:pci-e,linux-kernel,linux-device-driver,pci,linux 来源: https://codeday.me/bug/20191120/2040625.html