转载地址:https://www.cnblogs.com/zhouhaibing/p/7898792.html
1、PCI设备一般都具有双重身份,一方面作为PCI设备注册到Linux内核,另一方面,作为字符设备或者块设备,或者网络设备注册到Linux内核,所以,在看PCI设备时一定要注意到这点。
2、
一、PCI接口规范
1、PCI接口的配置空间
PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。
配置空间中最重要的有:
Vendor ID:厂商ID。知名的设备厂商的ID。FFFFh是一个非法厂商ID,可它来判断PCI设备是否存在。
Device ID:设备ID。某厂商生产的设备的ID。操作系统就是凭着 Vendor ID和Device ID 找到对应驱动程序的。
Class Code:类代码。共三字节,分别是 类代码、子类代码、编程接口。类代码不仅用于区分设备类型,还是编程接口的规范,这就是为什么会有通用驱动程序。
IRQ Line:IRQ编号。PC机以前是靠两片8259芯片来管理16个硬件中断。现在为了支持对称多处理器,有了APIC(高级可编程中断控制器),它支持管理24个中断。
IRQ Pin:中断引脚。PCI有4个中断引脚,该寄存器表明该设备连接的是哪个引脚。
2、PCI的中断实现
PCI的中断有两种实现方式,一种是INTx管脚拉电平的方式,一种是通过MSI-X内部消息的方式。
3、PCI和PCIE的区别
PCIE相当于把交换机引入到PCI设备中,PCI设备是点到点,PCIE引入lan的概念,可以实现高速,双向通道。
4、PCI寻址
每个PCI设备由一个总线号、一个设备号及一个功能号来标识。
5、查看当前系统上的pci设备
# lspci 显示设备上的pci设备
#显示设备上pci设备的pci号
#
6、PCI设备在Linux中的描述
所有的pci设备,在Linux中都用pci_dev结构体进行描述,由于一个PCI接口卡上可能包含多个功能模块,每个功能被当作一个独立的逻辑设备,因此,
每一个PCI 功能,即PCI 逻辑设备都唯一地对应一个pci_dev设备描述符。
7、PCI设备驱动描述,使用struct pci_driver进行描述。
二、PCI设备驱动初始化
1、初始化PCI设备结构体 intel 82599 万兆网卡
文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe)
pci 设备的编码如下:
2、注册PCI设备到内核 pci_register_driver
文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe)
3、激活PCI设备 pci_enable_device_mem()
一般情况下,在pci设备的probe函数中,在驱动程序可以访问pci设备的任何设备资源之前,驱动程序必须调用pci_enable_device_mem()函数。
文件:ixgbe_main.c (linux-4.6\drivers\net\ethernet\intel\ixgbe)
4、PCI设备申请存储资源 pci_request_selected_regions
文件:同上
5、申请成总线主DMA模式 pci_set_master,文件同上
6、一般情况下,都是在设备驱动的Probe函数中,完成PCI设备驱动的初始化,以及作为字符设备,块设备,或者网络设备的注册与初始化功能。