1、体系结构
1)PCI桥 -- 只有PCI桥才能生成PCI总线
2、PCI设备寻址:
每个PCI设备都由一个总线号、一个设备号和一个功能号组成。
一个系统最多拥有256条总线,每条总线最多带32个设备,但每个设备可以是最多8个功能的多功能板
/proc/iomem描述系统中所有的设备I/O在内存地址空间上的映射,
例如,PCI设备:40000000-400003ff:0000:00:1f.1
其中:
40000000-400003ff:代表设备所映射的内存空间地址
0000:00:1f.1:PCI外设的地址的地址,以冒号和逗号分隔为4个部分:
第一个16位表示域,第二个8位表示一个总线号,第三个5位表示一个设备号,最后三位表示功能
每个PCI设备都有一组固定格式的配置寄存器,即配置寄存器,配置寄存器由Linux内核中的PCI初始化代码与驱动程序共同使用,
内核在启动时负责对配置寄存器进行初始化,包括设备中断号以及I/O基址等
00H-01H: Vendor ID 制造商标识
02H-03H: Device ID 设备标识
04H-05H: Command 命令寄存器
06H-07H: Status 状态寄存器
08H : Revision ID 版本识别号寄存器
09H-0bH: Class Code 分类代码寄存器
0CH : Cache Line Size Cache行长度寄存器
0dH : Latency Timer 主设备延迟事件寄存器
0eH : Header Type 头标类型寄存器
0fH : Bulit-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-1FH: Base Address Register 3 基地址寄存器3
20H-23H: Base Address Register 4 基地址寄存器4
24H-27H: Base Address Register 5 基地址寄存器5
28H-2bH: Cardbus CLS Pointer 设备总线CIS指针寄存器
2cH-2dH: Subsystem Vendor ID 子设备制造商标识
2eH-2fH: Subsystem Device ID 子设备标识
30H-33H: Expasion ROM Base Address 扩展ROM基地址
34H-3bH: 保留
3cH : Interrupt Line 中断线寄存器
3dH : Interrupt Pin 中断引脚寄存器
3eH : Min_Gnt 最小授权寄存器
3fH : Max_Lat 最大延迟寄存器
3、Linux PCI驱动
使用struct pci_driver结构来描述
struct pci_driver
{
const struct pci_device_id *id_table;
int (*probe) (struct pci_dev *dev,const struct pci_device_id *id);
coid (*remove) (struct pci_dev *dev);
};
//注册驱动
pci_register_driver(struct pci_dev *dev);
//使能PCI设备,在PCI驱动使用PCI设备的任何资源(I/O或者中断)之前,需要使能设备
int pci_enable_device(struct pci_dev *dev);
一个PCI设备最多可以实现6个地址区域,大多数PCI设备在这些区域实现I/O寄存器,Linux提供一组函数来获取这个区间的基地址
//返回指定区域的起始地址,这个区域通过参数bar指定,范围从0-5,表示6个PCI区域中的一个
pci_resource_start(struct pci_dev*dev,int bar)
//返回指定区域的末地址
pci_resource_end(strcut pci_dev*dev,int bar)