PCI/PCIE相关知识
PCI/e配置空间
PCI/PCIe的配置空间Configuration Space是一个与Memory空间和IO空间并列的独立的空间。PCI Configuration Space有256 Bytes,对于PCIe Configuration Space,扩展为4096 Bytes,PCIe是在PCI基础上发展的协议,并且在此基础之上进行了扩展,其扩展形式是通过一种称为Capability的寄存器块来完成的。
访问方式
IO方式
CPU提供了两组I/O寄存器用于访问配置空间:
- 配置空间控制寄存器 CF8h-CFBh
- 配置空间数据寄存器 CFCh-CFFh
传统方式,写IO端口CFCh和CF8h。只能访问PCI/PCIe设备的开始256个字节(PCI设备的配置空间本来就只有256个字节......)
// for PCI
address = BIT31 | ((Bus & 0xFF) << 16) | ((Dev & 0x1F) << 11) | ((Fun & 0x7) << 8) | (Reg & 0xfffffffc);//BIT31=0x80000000// write cfg register
IoWrite8(0xcf8, address);
// read data register
data8 = IoRead8(0xcfc);
data16 = IoRead16(0xcfc);
data32 = IoRead32(0xcfc);
Bit31代表enable bit。一定要置起来,否则不起作用。
MMIO方式
对于MMIO的访问,跟访问内存的方式一样,它从称为PCIEXBAR的基地址开始,有很大的一段空间,这个PCIEXBAR的值根据不同的平台可能不同,大致可能值有0xB0000000、0xC0000000等(飞腾用的就是0xB0000000)。
#define pcie_addr(m, b, d, f, o) (m + ((b & 0xff) << 20) + ((d & 0x1f) << 15) + ((f & 0x7) << 12) + (o & 0xfffffffc)
#define mmio_read8(addr) (*(volatile uint8 *)addr)
#define mmio_write8(addr, data8) *(volatile uint8 *)addr = data8
#define mmio_read16(addr) (*(volatile uint16 *)addr)
#define mmio_write16(addr, data16) *(volatile uint16 *)addr = data16
#define mmio_read32(addr) (*(volatile uint32 *)addr)
#define mmio_write32(addr, data32) *(volatile uint32 *)addr = data32
配置寄存器组内保留了对PCI设备的基本特性进行详尽说明的可读信息,CPU读取这些信息后,就可以为PCI设备设定符合需要的配置内容,从而实现自动配置。这些可读信息包括:
Vendor ID :设备供应商编号,由PCI SIG国际组织分配。
Device ID :特定设备编号,由设备供应商分配。
Revision ID :设备的特定版本号,由设备供应商分配。
Class Code :设备的功能类别编号。
Header Type :指示Header 中从地址10H到3FH区域的内容格式,同时指示该设备是否为多功能设备。
扫描PCI设备的时候,我们可以直接通过Vendor ID与Device ID是否为0xffff来判断设备是否存在,如果是,则设备不存在,不过也有一种情况,国产并不完备,在硬件设计的时候,很有可能这个不存在的值并不是0xffff,也有可能是0才不存在:
//// Create PCI address map in terms of Bus, Device and Func//Address = EFI_PCI_ADDRESS (Bus, Device, Func, 0);//// Read the Vendor ID register//Status = PciRootBridgeIo->Pci.Read (PciRootBridgeIo,EfiPciWidthUint32,Address,1,Pci);if (!EFI_ERROR (Status) && (Pci->Hdr).VendorId != 0xffff && (Pci->Hdr).VendorId != 0) {//// Read the entire config header for the device//Status = PciRootBridgeIo->Pci.Read (PciRootBridgeIo,EfiPciWidthUint32,Address,sizeof (PCI_TYPE00) / sizeof (UINT32),Pci);return EFI_SUCCESS;}
这部分代码在PciEnumeratorSupport.c文件中有定义
PCI/PCIE相关知识相关推荐
- PCIe基础知识及Xilinx相关IP核介绍
补发以下以前学习PCIe总结的知识. PCIe学习笔记系列: PCIe基础知识及Xilinx相关IP核介绍 概念了解:简单学习PCIe的数据链路与拓扑结构,另外看看有什么相关的IP核. [PG054] ...
- PCI设备驱动和相关知识
在研究黑苹果驱动时,经常会看到修改Info.plist中的IOPCIMatch字段.需要研究一下相关内容. PCI是一种外设部件互连标准总线,和USB总线差不多,可以将不同类型的设备连接到同一条总线上 ...
- pcie dma 相关知识整理(xilinx平台)
PCIE的DMA和PIO介绍 DMA数据传输方式 DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成, ...
- PCI-E基础知识学习
PCIE特点: (1)2种路由方式:基于地址的路由方式.基于ID(BDFR)的路由方式 (2)2种数据发送方式:Posted方式和No-Posted方式: (3)多种总线事务:配置读写.内存读写.IO ...
- PCIe物理层详细总结-PCIe专题知识(一)
目录 前言 一.简介 二.PCIe物理层结构及功能 2.1 PCIe端对端连接方式 2.2 PCIe组成 2.2.1 逻辑层(Logic) 1 发送逻辑 2 接收逻辑 2.2.2 电气层(Electr ...
- SSD固态硬盘的相关知识和选购
SSD固态硬盘的相关知识和选购 内存与外存 硬盘 固态硬盘的品牌.容量.颗粒 品牌(略) 容量(根据需求决定) 颗粒 固态硬盘的接口类型.总线通道.传输协议 固态硬盘的接口类型(插槽的形状) SATA ...
- 【PCI】PCI PCIE基础(一)
关于PCI相关基础知识请参阅 王齐 先生的著作<PCI Express 体系结构导读>,个人认为这本书是学习PCI与PCIE的经典之作,以下简要说明初学者应阅读哪些章节. PCI 第一 ~ ...
- PCIe热插拔机制(详细)总结-PCIe专题知识(五)
目录 前言 一.概述 二.原理详解 2.1 热插拔原理总结 2.2 热插拔软硬件要求 三.其他相关知识链接 1.PCIe物理层总结-PCIE专题知识(一) 2.PCIe数据链路层图文总结-PCIe专题 ...
- 主板是计算机所有部分连接的基础,计算机基础相关知识答案.doc
计算机基础相关知识答案 计算机基础相关知识 一.填空题: 1.计算机的硬件主要由(控制器).(运算器).(存储器).(输入输出设备)以及电源等硬件组成. 2.计算机硬件系统可以分为两大部分,即(主机 ...
- 硬件知识:固态硬盘相关知识介绍
今天就为大家全面科普一下固态硬盘的相关知识,让大家购买时做到心中有数,按需选择. 首先还是从SSD的结构来说起,SSD最基本的组成部件分为:主控芯片.闪存芯片.固件算法,下面我们分别阐述三者的工作职责 ...
最新文章
- getContext(),getApplicationContext(),getBaseContext()和“ this”之间的区别
- Kali Linux重新支持RTL8814au芯片
- java properties 路径问题_Java 读取Properties文件时应注意的路径问题
- 提示No Launcher activity found
- 使用JPA + Eclipselink操作PostgreSQL数据库
- Marshal在C#中的应用(void *指针到IntPtr的转化)
- C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)
- 在ListView控件中绘底图
- oracle 修改 回话数,Oracle命令--修改oracle回话数
- 好未来:今年12月31日停止内地义务教育阶段学科类培训
- Linux拷贝分区内容,dd复制分区后目标分区的大小变成原分区了
- kjb文件 解析_微信安装包解析异常
- echarts全国地图显示到城市级别
- 书籍折页是什么效果_书籍折页什么样 - 卡饭网
- mysql like 百分号_mysql语句中使用like后面的%(百分号)的问题
- 关于kali出现乱码问题
- 云免停机卡免流服务器监控
- Excel之动态数据分析报表
- HTML5之canvas剪切图片
- 教你制作服务器中更高效率的刷怪塔,我的世界低耗材高效率凋零骷髅刷怪塔制作攻略...
热门文章
- Excel——批量填充有序序列、填充字母序列、自定义序列排序
- 使用Github上传本地项目代码
- AcWing 1402. 星空之夜(Flood Fill/哈希/DFS)
- python读取nc文件并转换成csv_python - 在python 3中读取Crystal Report .rpt文件并将其转换为.csv或.xlsx - 堆栈内存溢出...
- c语言实现http下载功能
- python创建工作簿_【Python操作Excel】02_操作工作簿与工作表
- 属性动画实现卫星菜单效果
- BAT大牛亲授从零起步基于ElasticSearch的搜房网(前后端集成)实战(第二章需求分析和数据库设计)
- 前端基础知识总结 (三)
- 在华为工作十年的感悟