Linux驱动——PCI
Linux驱动——PCI
小狼@http://blog.csdn.net/xiaolangyangyang
PCI设备枚举过程:
(PC系统中BIOS和OS均实现了枚举过程,linux可通过内核PCI access mode配置选择使用OS还是BIOS进行枚举,嵌入式系统中枚举过程由linux驱动实现)
1、PCI控制器是通过读取配置空间寄存器的VID检测是否存在bridge或device,读取值为0xFF则为空;
2、PCI控制器在bus上(从bus0-device0-func0开始)扫描bridge,如果有bridge,则初始化该配置空间,写入bus num到该配置空间寄存器,再跳转到对应的bus上扫描下一级bridge(注意:该处写入bus号到硬件后,访问对应的下一级bridge才有效,其跳转就是读取对应的地址偏移的配置寄存器);
3、CPU最初只能扫描到bus0上的bridge或device,初始化其下的bridge配置寄存器后(写入bus num),才能正常扫描对应的下一级bus;
4、递归式扫描整个配置寄存器形成树状结构;
5、依次在所有的bus上扫描device,通过向BAR空间写0xFFFFFFFF,读取BAR值确定BAR地址空间size和type,一个func包括6个BAR空间,每个有效的BAR都需要分配物理地址;
6、系统分配物理空间地址(该地址即为PCI空间映射到MEM空间的物理地址)写到BAR寄存器高bit位,这样在CPU访问到该部分物理空间地址时,就落入到了RC空间。
PCI MEM/IO映射过程:
(由Linux driver实现)
Linux驱动申请虚拟地址将BAR寄存器分配的物理地址进行MEM or IO映射,CPU发出一个物理地址,落入分配给RC的空间,这个地址进入PCIE的调度体系,就可以从RC开始,变成PCIE自己的消息(TLP)。
NVMe协议:
NVMe协议是基于PCIe接口的一种SDD标准协议,其在PCIe上支持65536个命令队列,Message和Data(core)支持乱序,支持的接口如下:
1、message:用于传输命令,命令可变数据长度(512b到2Mb),一般只有一个message接口;
2、data(core):用于传输数据,一般有多个data接口。
PCI设备驱动程序:
左边主要涉及的是PCI总线驱动,那么PCI设备驱动是什么呢。PCI设备驱动是通过PCI总线桥梁连接的硬件设备的驱动,例如基于PCI总线的网卡设备。以下代码是一个典型的PCI设备代码框架:
疑难问答:
1、在枚举之前访问左右的配置空间是什么效果?
枚举之前,没有将bus num写入配置寄存器,只能访问到root bridge下的全部配置寄存器,其他配置寄存器读出来全是0。
例如root bridge下挂载有3个bridge,分别是B_A、B_B、B_C,每个bridge下挂载一个dev,分别是D_A、D_B、D_C,这时读取bus 0下的配置寄存器,能读到B_A、B_B、B_C,但是在任何bus下都读不到D_A、D_B、D_C。
把B_A的bus num写1后,就能读取到bus 1下的D_A;
把B_B的bus num写2后,才能读取到bus 2下的D_B;
把B_C的bus num写3后,才能读取到bus 2下的D_C。
2、写入BAR寄存器的地址是什么地址?
写入BAR寄存器的地址是PCI空间地址,CPU要访问这个地址,就得有MEM空间到PCI空间的地址映射,各平台映射关系如下(一般为一一映射关系):
X86:一一映射关系,只要CPU向某个物理地址写数据,bridge都能获取,如果是BAR地址,就会将该数据经bridge传到PCI;
powerPC:Outbound和Inbound寄存器组;
ARM:AXI总线传递数据,ARM使用ECAM的方式访问pcie配置空间,BAR空间也是吗?
3、怎么读写配置寄存器?
X86:PCIe配置寄存器与MEM独立编址,使用CFG_ADDR、CFG_DATA寄存器读写;
ARM ECAM映射:ECAM把PCIe配置寄存器映射到MEM空间,统一编址;
ARM硬件支持:硬件直接将PCIe配置寄存器分配到MEM空间,统一编址。
4、PCI空间与MEM空间怎么映射?
X86:一一对应映射;
ARM/PowerPc;使用Outbound和Inbound寄存器组进行映射配置。
Linux Kernel核心中文手册-Chapter6-PCI
必看:原来PCIe技术原理这么简单!
PCI BAR设置过程
PCIe设备枚举
PCI设备BAR空间的初始化
RISCV Platform Spec之PCIe
从cpu角度理解PCIe
从cpu角度理解PCIe续集
Linux驱动——PCI相关推荐
- pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载
下面点击下载安装,最新更新的这个版本对于很多用户来说,体验感觉还是可以的.虽然有一些小问题没有解决,但是大体上还是符合用户使用需求.尤其是针对之前版本的修改,就比较OK的感觉. 万能PCI串口卡驱动官 ...
- lin卡pci linux驱动下载,万能PCI串口卡驱动
万能PCI串口卡驱动官方版 万能PCI串口卡驱动官方版是款比较专业的pci串口卡通用驱动.万能PCI串口卡驱动支持大部分的pci串口卡.万能PCI串口卡驱动还可适用于win7.xp.linux系统,可 ...
- Linux下PCI转串口卡驱动安装方法
Linux下PCI转串口卡驱动安装方法 ----------------------------------- 由于公司产品要做行业市场,而产品与行业用户间PC的通讯为RS232串口方式.而行业用户那 ...
- pci-e串口卡linux 驱动下载,pci串口卡万能驱动
万能PCI串口卡驱动程序,支持绝大多数的串口卡.支持WINDOWS/LINUX系统.支持98/me/2000/xp/vista/server系统. 运行PCISETUP.EXE安装程序,选择卡的类型, ...
- 【Linux 驱动】第九章 与硬件通信
在学习有关I/O总线的内容时,最好先看看相关的知识:从PC总线到ARM的内部总线 一,I/O 端口和 I/O 内存 每种外设都是通过读写寄存器来进行控制. 大部分外设都有几个寄存器,不管是在内存地址空 ...
- linux platform匹配机制,Linux驱动中的platform总线详解
platform总线是学习linux驱动必须要掌握的一个知识点. 一.概念 嵌入式系统中有很多的物理总线:I2c.SPI.USB.uart.PCIE.APB.AHB linux从2.6起就加入了一套新 ...
- linux驱动篇之 driver_register 过程分析(一)
linux驱动注册过程分析--driver_register(一) 个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/artic ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
最新文章
- 一键安装lamp之php插件
- 第十八章 33用重载输出运算符函数实现字符串的输出
- Android面试题详细整理系列(三)
- Spring Data Jpa 实体类自动创建数据库表失败解决
- mysql heartbeat 高可用
- 三角形一点到三边距离最小_初中数学:相似三角形以及重心、向量问题考点整理...
- 二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))
- 计算机应用基础第五章在线测试答案,计算机应用基础在线测试第五章答案
- PyTorch框架学习十四——学习率调整策略
- elemntui icon 大小_自定义elementui中的图标
- SpringCloud微服务(06):Config组件,实现配置统一管理
- 简单十步python使用django框架建立博客网站
- web程序常见错误及解决方法
- ac3165无线网卡驱动linux,intel ac 3165无线网卡驱动下载v20.110.0 官方版
- HMTL5高拍仪开发包(支持谷歌 百度 火狐 360 QQ IE10以上等浏览器)
- 爬虫小练(刷访问量)(python+requests(headers+proxy)+Queue+threading)
- 手机怎么查看连接过的wifi密码
- 集合20210801
- 腾讯会议怎么录屏?几个步骤轻松录屏
- three相机在模型上_深入理解Three.js中透视投影照相机PerspectiveCamera
热门文章
- 修改本地连接IP地址的脚本包括修改备用dns的方法(批处理命令)
- 在EPS开发中遵循ISO 26262标准
- 修改tomcat编码格式
- 破解“跑步膝”,应着重练臀部肌肉
- python 利用百度推广API接口,每日调整关键词价格,关键词点击率大于10%的进行降低价格和点击率小于4%进行增加价格
- 摄像机IPC控件下载及安装问题
- _undo_autotune(关闭undo retention优化建议)
- 三种方法:写一个函数,每调用一次函数,就会将num的值增加1,&&可能遇到的问题
- 利用python实现文件搜索功能
- Mac百度网盘下载慢怎么办?Mac百度网盘下载满速教程