总线概念
总线是一种传输信号的信道;总线是连接一个或多个半导体的电气连线。总线由电气接口和编程接口组成,对于软件设计人员来说,重点关注编程接口。
PCI总线
PCI(Perpheral Component Interconnect)(外围设备互联),是在桌面及更大型的计算机上普遍使用的外设总线。
PCI总线优点:
- 在计算机和外设间传输数据时具有更好的性能
- 能够尽量独立于具体的平台
- 可以方便的实现即插即用
PCI总线体系结构
体系结构1
PCI桥用于生成PCI总线
体系结构2
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设备
由下边的数据画出PCI结构图
可以得到如下结构图:
配置寄存器
每个PCI设备都有一组固定格式的寄存器,即配置寄存器,配置寄存器由linux内核中的PCI初始化代码与驱动程序共同使用。内核在启动时负责对配置寄存器进行初始化,包括设置中断号以及I/O基址等。
寄存器组织架构图:
这些寄存器中比较重要的配置
- 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 最大延迟寄存器