从软件开发角度看待PCI和PCIe

news2024/11/15 8:43:18

从软件开发角度看待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开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

特斯拉2022全年财报摘要

重点一览一、盈利方面 2022全年营业利润率为16.8%,其中第四季度为16.0% 2022全年GAAP营业利润为137亿美元,其中第四季度为39亿美元 2022全年GAAP净利润为126亿美元,其中第四季度为37亿美元 2022全年非GAAP净利润为141亿美元,其中…

MySQL中的多表联合查询

目录 一.介绍 数据准备 交叉连接查询 内连接查询 外连接 子查询 特点 子查询关键字 all关键字 any关键字和some关键字 in关键字 exists关键字 自关联查询 总结 一.介绍 多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要…

四足机器人发展史及机器人盘点

四足机器人发展史及机器人盘点 本文翻译整理自文章 四足行走机器人发展综述 20世纪初前后 1870 CHebyshev(沙俄)发明了第一个行走机构, 将旋转运动转换为匀速平动运动. - 由于连接机构形似希腊字母λ, 该连杆命名为λ机构. - 可在平面运动, 没有独立的腿部运动 - Rygg(美国…

windows下nodejs下载及环境变量配置,运行vue项目

文章目录1.下载安装node.js2.环境变量配置(重点)3.切换镜像源切换yarn作为主力命令1.下载安装node.js 1.https://registry.npmmirror.com/binary.html 搜索node,下载对应的版本,安装即可。一路next,路径选择自己想放置…

与string容易混淆的类——StringBuilder

目录 StringBuilder类概述及其构造方法 StringBuilder类的常用方法 StringBuilder类练习 StringBuilder类概述及其构造方法 StringBuilder类概述–我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,…

verilog图像算法实现与仿真(流程和实现)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们谈到了fpga,谈到了用pythoncv2实现图像算法,直到现在才算是慢慢进入了正题。毕竟用verilog实现图像算法&#xff0c…

HalfEdge半边数据结构详解

我们可以将离散表面表示为多边形网格。 多边形网格可以被认为是图(具有顶点和顶点之间的边)加上面列表,其中面是边的环。 推荐: 使用 NSDT场景设计器 快速搭建 3D场景。 下面,我们将网格指定为顶点列表和面列表&#…

【博学谷学习记录】大数据课程-学习第四周总结

分布式技术 为什么需要分布式 计算问题 无论是我们在学校刚开始学编程,还是在刚参加工作开始处理实际问题,写出来的程序都是很简单的。因为面对的问题很简单。以处理数据为例,可能只是把一个几十K的文件解析下,然后生成一个词频…

Python正则表达式所有函数详解

文章目录1 fullmatch2 match3 search4 findall5 finditer6 split7 sub8 compile本篇博客主要讲解正则表达式相关的函数,均不涉及复杂的正则表达式语法。如需了解正则表达式语法,请参考下面的文章:Python正则表达式语法详解1 fullmatch Pytho…

96. BERT预训练代码

利用实现的BERT模型和从WikiText-2数据集生成的预训练样本,我们将在本节中在WikiText-2数据集上对BERT进行预训练。 import torch from torch import nn from d2l import torch as d2l首先,我们加载WikiText-2数据集作为小批量的预训练样本,…

Logstash:如何使用 Logstash 解析并摄入 JSON 数据到 Elasticsearch

在我之前的文章 “Logstash:Data 转换,分析,提取,丰富及核心操作” 有涉及到这个话题。今天我想使用一个具体的例子来更深入地展示。 准备数据 我们先来把如下的数据拷贝下来,并保存到一个叫做 sample.json 的文件中。…

OS 学习笔记(5) 操作系统的体系结构

OS 学习笔记(5) 操作系统的体系结构 王道OS 1.4 操作系统的体系结构 文章目录OS 学习笔记(5) 操作系统的体系结构知识总览分层结构模块化操作系统的内核大内核 vs 微内核知识回顾与重要考点外核王道chap1 回顾英文表达、术语积累(《操作系统概念》第九版、ostep 《O…

电子模块|心率血氧传感器模块MAX30102及其驱动代码

电子模块|心率血氧传感器模块MAX30102及其驱动代码实物照片模块简介工作原理原理图及引脚说明STM32软件驱动IIC通信代码数值转换代码main函数结果实物照片 模块简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。 它集成了一个红光LED和一个红外光LED、光电…

【经济学】MIT 微观经济学 Microeconomoics

MIT 微观经济学P1 Introduction and Supply & Demand约束优化和机会成本供给和需求P1 Introduction and Supply & Demand 约束优化和机会成本 微观经济学是研究如何个人和公司做决定在一个稀缺的世界。稀缺性是微观经济的驱动力。 微观经济学是一系列约束优化练习&a…

Hadoop安全之Kerberos

简介 安全无小事,我们常常要为了预防安全问题而付出大量的代价。虽然小区楼道里面的灭火器、消防栓常年没人用,但是我们还是要准备着。我们之所以愿意为了这些小概率事件而付出巨大的成本,是因为安全问题一旦发生,很多时候我们将…

自学数据分析——数据分析方法和模型

一、数据分析方法 数据分析的思维需要培养,先模仿别人,从模仿者到创造者。首先需要建立数据的敏感性,能快速了解数据在说什么,下面我们以抖音教育直播为例,首先来了解核心指标,以及各个指标所表示的含义。…

17.Stream流

目录 一.Stream流 1.1 什么是Stream流 1.2 Stream流思想 1.3 Stream流的三类方法 1.4 获取Stream流 1.4.1 集合获取Stream流的方式 1.4.2 数组获取Stream流的方式 1.5 中间方法 1.6 终结方法 1.7 收集Stream流 1.7.1 什么是收集Stream流 1.7.2 收集方法 一.Stream流…

Ant Design Vue 之a-tree-select

Ant Design Vue 是比较流行的vue框架之一&#xff0c;主要是展示a-tree-select 的简单用法&#xff0c;a-tree-select组件主要用于展示树结构的选择。 <template><a-spin :spinning"confirmLoading"><a-form :form"form"><a-form-ite…

CnOpenDataA股上市公司社会责任报告数据

一、数据简介 A股上市公司社会责任报告数据由和讯网自2013年开始独家策划的产品&#xff0c;也是国内首家上市公司社会责任专业测评产品。上市公司社会责任报告专业测评体系从股东责任、员工责任、供应商、客户和消费者权益责任、环境责任和社会责任五项考察&#xff0c;各项分…

Linux Workqueue

Linux Workqueue 1、前言 Workqueue 是内核里面很重要的一个机制&#xff0c;特别是内核驱动&#xff0c;一般的小型任务 (work) 都不会自己起一个线程来处理&#xff0c;而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。 所以 …