概述

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设备驱动的初始化,以及作为字符设备,块设备,或者网络设备的注册与初始化功能。

 

posted on 2017-11-26 23:30  爱编程的小兵  阅读(14357)  评论(0编辑  收藏  举报