从软件开发角度看待PCI和PCIe
文章目录
- 从软件开发角度看待PCI和PCIe
- 参考资料:
- 一、 最容易访问的设备是什么
- 二、 地址空间的概念
- 三、 理解PCI和PCIE的关键
- 3.1 地址空间转换
- 3.2 PCI接口速览
- 3.3 PCIe接口速览
- 四、 访问PCI/PCIe设备的流程
- 4.1 PCI/PCIe设备的配置信息
- 4.2 主机读取设备配置信息、分配空间
- 4.3 CPU地址空间和PCI/PCIe地址空间怎么转换?
- 4.3 主机像读写内存一样访问设备
- 致谢
参考资料:
- 《PCI Express Technology》,Mike Jackson, Ravi Budruk; MindShare, Inc.
- 《PCIe扫盲系列博文》,作者Felix,这是对《PCI Express Technology》的理解与翻译
- 《PCI EXPRESS体系结构导读 (王齐)》
- 《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》
- 《NCB-PCI_Express_Base_5.0r1.0-2019-05-22》
一、 最容易访问的设备是什么
是内存!
要读写内存,知道它的地址就可以:
volatile unsigned int *p = 某个地址;
unsigned int val;
*p = val; /* 写 */
val = *p; /* 读 */
只有内存能这样简单、方便地使用吗?
不是的,所有的"ram-like"接口设备都可以这样操作。
什么叫"ram-like"接口?
- 要发出地址:有地址线
- 要读写数据:有数据线
- 怎么分辨是读还是写:有读写信号
- 众多"ram-like"设备共享上面的信号,怎么才能互不影响?每个设备都有自己的片选信号
如下图所示:
- CPU发出addr,到达内存控制器,也出现在RAM、Flash、GPIO等设备上
- 使能设备:
- 如果addr属于RAM的地址范围,cs0就被使能
- 如果addr属于Flash的地址范围,cs1就被使能
- 如果addr属于GPIO的地址范围,cs2就被使能
- 没有被使能的设备,就相当于没接上去一样,不会影响其他设备
- 读写数据
关键在于:内存控制器,它会根据地址范围发出对应的片选信号,选中对应的设备。
二、 地址空间的概念
以人类为例:
- 爷爷生了4个小孩,排行1234
- 老大又生了4个小孩,排行1234
- 这2个"1234"辈分不一样,空间不一样
嵌入式系统中的地址空间:
- CPU发出addr,可以用来方位EMMC控制器
- 但是CPU发出的addr,不能直接到达EMMC Flash
- 想访问EMMC Flash
- 必须用过EMMC控制器
- 编写EMMC控制器驱动程序
- 如果CPU发出的addr,可以直接到达EMMC Flash,那就简单了
三、 理解PCI和PCIE的关键
3.1 地址空间转换
3.2 PCI接口速览
3.3 PCIe接口速览
四、 访问PCI/PCIe设备的流程
4.1 PCI/PCIe设备的配置信息
PCI/PCIe设备上有配置空间(配置寄存器),用来表明自己"需要多大的地址空间"。
注意,这是PCI/PCIe地址空间。
4.2 主机读取设备配置信息、分配空间
主机上的程序访问PCI/PCIe设备,读出配置信息。
分配地址空间:注意,分配的是PCI/PCIe地址空间。
把地址空间首地址写入设备。
4.3 CPU地址空间和PCI/PCIe地址空间怎么转换?
假设CPU发出的addr_cpu,是用来方位PCI设备的,转换关系为:
addr_pci = addr_cpu + offset
在PCI/PCIe控制器中,有某个寄存器,有来保存offset值。
4.3 主机像读写内存一样访问设备
示例代码如下:
volatile unsigned int *p = addr_cpu;
unsigned int val;
*p = val; /* 写, 硬件会把addr_cpu转换为addr_pci去写PCI/PCIe设备 */
val = *p; /* 读, 硬件会把addr_cpu转换为addr_pci去读PCI/PCIe设备 */
致谢
以上笔记源自
韦东山
老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!
在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!