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相关推荐

  1. pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载

    下面点击下载安装,最新更新的这个版本对于很多用户来说,体验感觉还是可以的.虽然有一些小问题没有解决,但是大体上还是符合用户使用需求.尤其是针对之前版本的修改,就比较OK的感觉. 万能PCI串口卡驱动官 ...

  2. lin卡pci linux驱动下载,万能PCI串口卡驱动

    万能PCI串口卡驱动官方版 万能PCI串口卡驱动官方版是款比较专业的pci串口卡通用驱动.万能PCI串口卡驱动支持大部分的pci串口卡.万能PCI串口卡驱动还可适用于win7.xp.linux系统,可 ...

  3. Linux下PCI转串口卡驱动安装方法

    Linux下PCI转串口卡驱动安装方法 ----------------------------------- 由于公司产品要做行业市场,而产品与行业用户间PC的通讯为RS232串口方式.而行业用户那 ...

  4. pci-e串口卡linux 驱动下载,pci串口卡万能驱动

    万能PCI串口卡驱动程序,支持绝大多数的串口卡.支持WINDOWS/LINUX系统.支持98/me/2000/xp/vista/server系统. 运行PCISETUP.EXE安装程序,选择卡的类型, ...

  5. 【Linux 驱动】第九章 与硬件通信

    在学习有关I/O总线的内容时,最好先看看相关的知识:从PC总线到ARM的内部总线 一,I/O 端口和 I/O 内存 每种外设都是通过读写寄存器来进行控制. 大部分外设都有几个寄存器,不管是在内存地址空 ...

  6. linux platform匹配机制,Linux驱动中的platform总线详解

    platform总线是学习linux驱动必须要掌握的一个知识点. 一.概念 嵌入式系统中有很多的物理总线:I2c.SPI.USB.uart.PCIE.APB.AHB linux从2.6起就加入了一套新 ...

  7. linux驱动篇之 driver_register 过程分析(一)

    linux驱动注册过程分析--driver_register(一) 个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/artic ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

最新文章

  1. 一键安装lamp之php插件
  2. 第十八章 33用重载输出运算符函数实现字符串的输出
  3. Android面试题详细整理系列(三)
  4. Spring Data Jpa 实体类自动创建数据库表失败解决
  5. mysql heartbeat 高可用
  6. 三角形一点到三边距离最小_初中数学:相似三角形以及重心、向量问题考点整理...
  7. 二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))
  8. 计算机应用基础第五章在线测试答案,计算机应用基础在线测试第五章答案
  9. PyTorch框架学习十四——学习率调整策略
  10. elemntui icon 大小_自定义elementui中的图标
  11. SpringCloud微服务(06):Config组件,实现配置统一管理
  12. 简单十步python使用django框架建立博客网站
  13. web程序常见错误及解决方法
  14. ac3165无线网卡驱动linux,intel ac 3165无线网卡驱动下载v20.110.0 官方版
  15. HMTL5高拍仪开发包(支持谷歌 百度 火狐 360 QQ IE10以上等浏览器)
  16. 爬虫小练(刷访问量)(python+requests(headers+proxy)+Queue+threading)
  17. 手机怎么查看连接过的wifi密码
  18. 集合20210801
  19. 腾讯会议怎么录屏?几个步骤轻松录屏
  20. three相机在模型上_深入理解Three.js中透视投影照相机PerspectiveCamera

热门文章

  1. 修改本地连接IP地址的脚本包括修改备用dns的方法(批处理命令)
  2. 在EPS开发中遵循ISO 26262标准
  3. 修改tomcat编码格式
  4. 破解“跑步膝”,应着重练臀部肌肉
  5. python 利用百度推广API接口,每日调整关键词价格,关键词点击率大于10%的进行降低价格和点击率小于4%进行增加价格
  6. 摄像机IPC控件下载及安装问题
  7. _undo_autotune(关闭undo retention优化建议)
  8. 三种方法:写一个函数,每调用一次函数,就会将num的值增加1,&&可能遇到的问题
  9. 利用python实现文件搜索功能
  10. Mac百度网盘下载慢怎么办?Mac百度网盘下载满速教程