linux设备驱动之PCI总线概述

时间:2024-04-05 20:31:49

总线概念

总线是一种传输信号的信道;总线是连接一个或多个半导体的电气连线。总线由电气接口和编程接口组成,对于软件设计人员来说,重点关注编程接口。

PCI总线

PCI(Perpheral Component Interconnect)(外围设备互联),是在桌面及更大型的计算机上普遍使用的外设总线。

PCI总线优点:

  • 在计算机和外设间传输数据时具有更好的性能
  • 能够尽量独立于具体的平台
  • 可以方便的实现即插即用

PCI总线体系结构

体系结构1
linux设备驱动之PCI总线概述
PCI桥用于生成PCI总线

体系结构2
linux设备驱动之PCI总线概述

PCI设备寻址

每个PCI设备由一个总线号、一个设备号、和一个功能号确定。PCI规范允许一个系统最多拥有256条总线,每条总线最多带32个设备,但每个设备可以是最多8个功能的多功能板(如:一个音频设备带一个CD-ROM驱动器)。

/proc/iomem描述了系统中所有设备I/O在内存地址空间上的映射。
可以看到地址从1G开始的第一个设备在/proc/iomem中是如何描述的:
40000000—400004ff : 0000:00:1f.1
这是一个PCI设备,40000000—400004ff 是它所映射的内存地址,占据了内存地址空间1024 bytes的位置,而0000:00:1f.1则是这个PCI外设的地址,它以冒号和逗号分隔为4个部分,第一个16位表示域,第二个8位表示一个总线号。第三个5位表示一个设备号,最后是3位,表示功能

PCI寻址

在linux系统中,可以通过 lspci 命令查看系统中的PCI设备
linux设备驱动之PCI总线概述
由下边的数据画出PCI结构图
linux设备驱动之PCI总线概述linux设备驱动之PCI总线概述
可以得到如下结构图:
linux设备驱动之PCI总线概述

配置寄存器

每个PCI设备都有一组固定格式的寄存器,即配置寄存器,配置寄存器由linux内核中的PCI初始化代码与驱动程序共同使用。内核在启动时负责对配置寄存器进行初始化,包括设置中断号以及I/O基址等。
寄存器组织架构图:
linux设备驱动之PCI总线概述
这些寄存器中比较重要的配置

  • 00H—01H Vendor ID 制造商标识
  • 02H—03H Device ID 设备标识
  • 04H—05H Command 命令寄存器
  • 06H—07H Status 状态寄存器
  • 08H Revison ID 版本识别号寄存器
  • 09H—0bH Class Code 分类代码寄存器
  • 0cH Cache Line Size CACHE 行长度寄存器
  • 0dH Latency Timer 主设备延迟时间寄存器
  • 0eH Header Type 投标类型寄存器
  • 0fH Built-in-teset Register 自测试寄存器
  • 10H—13H Base Address Register 0 基地址寄存器0
  • 14H—17H Base Address Register 1 基地址寄存器1
  • 18H—1bH Base Address Register 2 基地址寄存器2
  • 1cH—19H Base Address Register 3 基地址寄存器3
  • 30H—33H Expasion ROM Base Address 扩展ROM基地址
  • 34H—3bH 保留
  • 3cH Interrupt Line 中断线寄存器
  • 3dH Interrupt Pin 中断引脚寄存器
  • 3eH Min_Gnt 最小授权寄存器
  • 3fH Max_Lat 最大延迟寄存器