PCI总线应用领域及其广泛并且令人惊奇。不同的pci设备有不同的需求以及不同的问题。因此,在linux内核中pci层支持就非常重要啦。本文档就是想为驱动程序设计开发人员解决pci处理中的各种问题。
0.Pci设备驱动程序的结构
现在有两种风格的的pci驱动程序结构:新风格的驱动(即让pci层来做大量设备探测
工作并且支持热插拔功能)和旧风格的驱动(即由驱动程序自己探测设备)。除非你有很好的理由,否则就不要用旧风格写驱动程序。当驱动程序找到所驱动的设备后,将执行以下步骤:
启用设备
访问设备配置空间
检测设备资源(如基地址和中断号)
分配设备资源
与设备通讯
下文将论述以上大部分步骤,其余部分请参考,它有不错的注释。
如果没有配置pci子系统(即CONFIG_PCI没有置位),以下介绍的大部分函数都被定义为内联函数,它们要么是空的,要么返回对应的错误代码以避免在驱动中出现过多的条件宏ifdefs。
1.新风格的驱动程序
新风格的驱动程序只是在初始化时调用pci_register_driver,调用时使用一个指向struct pci_driver的结构指针。该指针包含以下几个分量:
name驱动程序名称
id_table指向一个与驱动程序相关的设备ID表的指针。大多数驱动程序应当用MODULE_DEVICE_TABLE(pci,…)将该设备ID表导出。在调用prob( )时设成NULL以让系统检测到所有的pci设备。
probe指向设备检测函数prob( )的指针。该函数将在pci设备ID与设备ID表匹配且还没有被其它驱动程序处理时(一般在对已存在的设备执行pci_register_driver或以后又有新设备插入时)被调用。调用时传入一个指向struct pci_dri