zoukankan      html  css  js  c++  java
  • Linux PCI设备驱动的实现思路与思想

    概述

    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.6drivers etethernetintelixgbe) 

        

        pci 设备的编码如下:

        

    2、注册PCI设备到内核 pci_register_driver

      文件:ixgbe_main.c (linux-4.6drivers etethernetintelixgbe) 

        

    3、激活PCI设备 pci_enable_device_mem()

      一般情况下,在pci设备的probe函数中,在驱动程序可以访问pci设备的任何设备资源之前,驱动程序必须调用pci_enable_device_mem()函数。

      文件:ixgbe_main.c (linux-4.6drivers etethernetintelixgbe) 

        

    4、PCI设备申请存储资源 pci_request_selected_regions

      文件:同上

        

    5、申请成总线主DMA模式 pci_set_master,文件同上

    6、一般情况下,都是在设备驱动的Probe函数中,完成PCI设备驱动的初始化,以及作为字符设备,块设备,或者网络设备的注册与初始化功能。

  • 相关阅读:
    CTK 编译
    MITK 2021.2编译
    执行git add .报错LF will be replaced by CRLF in
    vscode标记“&&”不是此版本中的有效语句分隔符
    vscode prettier插件使用无效
    vscode使用技巧
    kafka及hdfs常用命令
    博客已迁移
    SVM
    逻辑回归
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/7898792.html
Copyright © 2011-2022 走看看