俗话说的好,免费是最贵,闲暇是最累的,但是我自己选的路就要负责走完;
压力一天比一天重,当学习了理论却不知道该如何输出的时候,会有一种油然而生的挫败感;
看来必须得调整自己的心态还是要调整学习方法,如何才能用最好状态去接受新的知识;
文章目录
[0x100]概念与特征
[0x110] PCI接口特征
概述 | 描述 |
---|---|
更高传输性能 | 由于拥有 66MHz~133MHz 的时钟频率传输速率、32/64位内存地址空间 |
替代ISA设备 | 用于计算机与外设通讯的接口 |
平台无关性 | 接口板自动探测、无需初始化配置,多功能中断线明确不冲突 |
多设备支持 | 基于PCI域,最多支持256域 每个域支持32 个设备 |
存在配置空间 | 通过普通I/O 寻址访问配置空间, 每个PCI设备拥有256K大小配置空间 |
这里黑了一张书上的图图,描述 PCI到底处于总线架构什么位置,以及怎么连接到CPU的
[0x120] PCI接口寻址
- 8位总线编号 + 8 位设备/功能编号
- 8位总线编号 + 8 位设备编号 + 4位功能编号 [图示]
- 16位PCI域号 + 8 位总线编号 + 5 位设备编号 + 3位功能编号
- 总线共享空间 :PCI内存映射、PCI I/O端口
- 总线私有空间 :配置寄存器
[0x200] PCI设备相关信息
[0x210]配置空间
- PCI 设备引导阶段只响应配置事务,因为配置空间没有初始化成功时,不知道存在哪些设备;
- 所有设备中断为禁用状态;
前64字节的配置空间
- PCI 配置寄存器的字节序是小端字节序,如果使用大端的系统时,要注意访问问题;
- PCI 共有256k的配置空间,前64位标准的寄存器空间,后面空间为外设卡修改
- 16 位厂商ID [0x1 0x2]+ 16位设备ID[0x3 0x4]==设备标识符;
- 24 位类代号 高8位为所属主类;
- 16 位子系统厂商ID + 16位子系统设备ID == 子系统标识符,用于设备PCI设备具体型号区别;
#include <linux/mod_devicetable.h>
/*驱动程序支持设备标识列表,通常是以结构体数组的形式出现,结束需要显式指定"{}"*/
struct pci_device_id {
__u32 vendor, device; /* PCI设备标识符 Vendor and device ID or PCI_ANY_ID*/
__u32 subvendor, subdevice; /* PCI设备型号标识符 Subsystem ID's or PCI_ANY_ID */
__u32 class, class_mask; /* PCI设备所属设备组类 (class,subclass,prog-if) triplet */
kernel_ulong_t driver_data; /* PCI驱动私有数据*/
};
/*初始化 仅配置vendor和device,子系统型号被设置成了 PCI_ANY_ID*/
#define PCI_DEVICE(vend,dev) \
.vendor = (vend), .device = (dev), \
.subvendor = PCI_ANY_ID, .subdevice = PCI