目录
1. 简介
1.1 Data Mover
DMA/Bridge Subsystem for PCIe 就是一个数据搬运器件,用于在主机内存和 DMA 子系统之间搬运数据。子系统通过处理一种叫做 “描述符” 的数据结构来完成在主机内存和 DMA 子系统之间移动数据的任务。
|------| |------------------------------FPGA-----------------------------|
| | | |---------------| |-------------------| |
| | | | | | | |
| Host | PCIe | | DMA/Bridge | M_AXI S_AXI | User Logic | |
| App |<---------->|<-->| for PCIe |<---------------->| e.g. | |
| | slot | | | | HW Accelerator | |
| | | | (AXI-master) | | (AXI-slave) | |
| | | |---------------| |-------------------| |
|------| |---------------------------------------------------------------|
连接不同的 AXI-slave,可以实现不同的功能:
- 连接 AXI BRAM 或 AXI DDR MC,则整个 FPGA 可以看作一个 PCIe 内存设备,Host-PC 可以读写该内存;
- 一个硬件加速器,则 Host-PC 可以通过 PCIe 调用该加速器;
- AXI 桥,下游挂多个 AXI slave ,可以同时实现更多功能。
1.2 描述符
你可以把 “描述符” 想象成一个包含了数据传输指令的小包裹。这个包裹里面明确地写着:
- 源 (Source): 数据从哪里来(例如,主机内存中的某个具体地址)。
- 目标 (Destination): 数据要到哪里去(例如,DMA 子系统中的某个地址,或者反过来)。
- 要传输数据量 (Amount of data to transfer): 需要移动多少数据(例如,多少个字节)。
DMA 子系统会读取并执行这些 “描述符” 中的信息,从而自动地将数据从源地址搬运到目标地址,而不需要 CPU 的直接干预。
简单来说,DMA 子系统依靠这些 “描述符” 来了解它需要做什么样的数据搬运工作。
2. ZCU102
2.1 Ubuntu OS
2.2 USB Host
2.2.1 连接拓扑
PHY IC: USB3320 @U116
2.2.2 设备类型
USB 设备类型
- A 类设备:指的是标准的 USB Host 设备,如计算机或笔记本电脑,它们提供电源并管理连接的 USB 设备。
- B 类设备:通常是外围设备,如打印机、鼠标或键盘,它们从 A 类设备接收电源和数据。
2.2.3 USB 跳帽设置
跳帽设置:
2.3 无线网卡
下载地址:
W311MI _Tenda-All For Better NetWorkingW311MIhttps://www.tendacn.com/product/overview/W311MIv6.html
W311MIv6.0 Driver (Ubuntu/UOS/Kylin OS) 可以给 KV260、ZCU102 的 Ubuntu 系统使用。
2.4 PCIe Info
2.4.1 Diagram
1)Diagram
Form factor for PCIe Gen2x4 Host, Micro-ATX chassis footprint
2.4.2 lspci -tv
显示了系统的PCIe拓扑结构
>> lspci -tv
---
-[0000:00]---00.0-[01-0c]----00.0 Xilinx Corporation Device 9021
1)[0000:00]:是 PCIe 层级结构的根节点(Root Complex)
- 0000 是 PCI 域号(domain number),通常为 0000
- 00 是总线号(bus number),00 表示这是根总线
2)---00.0:是根端口(Root Port)的设备号和功能号
- 00 是设备号(device number)
- .0 是功能号(unction number)
3)-[01-0c]:表示这个根端口连接的下游设备所在的总线范围
- 01-0c 表示总线号从 01 到 0c (十进制12)
- 这意味着这个根端口下可以有多达 12 个不同的总线
4)00.0 Xilinx Corporation Device 9021
- 00.0 是子 PCI 设备的设备和功能编号
- Xilinx Corporation Device 9021 是设备的供应商和型号
>> lspci -vt
-[0000:00]-+-00.0 Intel Corporation Device 9b53
+-01.0-[01]----00.0 Xilinx Corporation Device 9021
+-02.0 Intel Corporation Device 9bc8
+-04.0 Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
+-12.0 Intel Corporation Comet Lake PCH Thermal Controller
+-14.0 Intel Corporation Comet Lake USB 3.1 xHCI Host Controller
+-14.2 Intel Corporation Comet Lake PCH Shared SRAM
+-16.0 Intel Corporation Comet Lake HECI Controller
+-16.3 Intel Corporation Device 06e3
+-17.0 Intel Corporation Device 06d2
+-1b.0-[02]----00.0 SK hynix Device 1339
+-1f.0 Intel Corporation Device 0687
+-1f.3 Intel Corporation Comet Lake PCH cAVS
+-1f.4 Intel Corporation Comet Lake PCH SMBus Controller
+-1f.5 Intel Corporation Comet Lake PCH SPI Controller
\-1f.6 Intel Corporation Ethernet Connection (11) I219-LM
这两行:
+-01.0-[01]----00.0 Xilinx Corporation Device 9021
+-1b.0-[02]----00.0 SK hynix Device 1339
这两行之所以看起来和别的不一样,它们表示的是 PCI 桥(PCI Bridge) 以及连接在该桥后面的设备。
- 普通行 (例如 +-02.0 Intel Corporation Device 9bc8): 显示的是直接连接在当前总线(这里是总线 00)上的终端设备(Endpoint Device),比如集成显卡、USB 控制器、网卡等。它们不连接其它总线。
- 特殊行 (例如 +-01.0-[01]----00.0 Xilinx ...): 显示的是一个 PCI 桥 (01.0) 以及通过这个桥连接到下一级(次级)总线 ([01]) 上的第一个设备 (00.0)。这种表示方法突出了设备间的层级和连接关系,显示了哪些设备是挂载在桥下面的。
2.4.3 lspci -v
lspci 提供了系统中 PCIe 桥接设备(Xilinx Corporation 制造)的详细信息:
ubuntu@zynqmp:~$ lspci -vv
---
00:00.0 PCI bridge: Xilinx Corporation Device d021 (prog-if 00 [Normal decode])
Control: I/O- Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin A routed to IRQ 62
Bus: primary=00, secondary=01, subordinate=0c, sec-latency=0
I/O behind bridge: 00000000-00000fff [size=4K]
Memory behind bridge: [disabled]
Prefetchable memory behind bridge: [disabled]
Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- <SERR- <PERR-
BridgeCtl: Parity- SERR+ NoISA- VGA- VGA16- MAbort- >Reset- FastB2B-
PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
Capabilities: <access denied>
Kernel driver in use: pcieport
2.4.2.1 设备基本信息
1)设备位置与类型
- 00:00.0 表示设备在 PCI 总线上的位置(总线 00,设备 00,功能 0)。
- 这是一个 PCI 桥接器(PCI bridge),型号为 Xilinx Corporation Device d021,用于连接主总线(00)和次级总线(01-0c)。
2)编程接口(prog-if)
- Normal decode 表示桥接器以标准方式解码 PCI 地址。
2.4.2.2 控制与状态寄存器
- 功能禁用(带
-
),功能启用(带+)
1)Control 寄存器
- BusMaster+:桥接器可以发起总线请求(DMA 操作)。
- I/O- Mem-:桥接器未启用 I/O 和内存空间访问(可能未配置或未激活)。
- 其他标志(如 SERR-、FastB2B-)表示错误报告和快速传输功能未启用。
2)Status 寄存器
- Cap+:设备支持 Capability List(扩展功能列表)。
- DEVSEL=fast:设备快速响应访问请求。
- 无错误状态(ParErr-、SERR- 等)。
2.4.2.3 中断与总线拓扑
1)中断路由:
- Interrupt: pin A routed to IRQ 62
- 桥接器的中断引脚 A 连接到系统的 IRQ 62。
2)总线范围:
- primary=00:主总线编号 00(连接 CPU)。
- secondary=01:次级总线起始编号 01。
- subordinate=0c:次级总线结束编号 0c(表示该桥接器下可管理总线 01-0c)。
- sec-latency=0:次级总线访问延迟为 0。
2.4.2.4 地址空间配置
1)I/O 空间:
- 00000000-00000fff [size=4K]
- 桥接器后挂载的设备的 I/O 空间范围为 4KB,但当前未启用(I/O behind bridge 未分配实际地址)。
2)内存空间:
- Memory behind bridge: [disabled]
- 内存和预取内存空间均未启用(可能需动态配置或未使用)。
2.4.2.5 桥接器控制与能力
1)Secondary Status
- 次级总线的状态(类似主状态寄存器),无错误或特殊配置。
2)BridgeCtl
- 控制桥接器行为的标志,例如:
- SERR+:启用系统错误报告。
- NoISA-:允许 ISA 风格的访问(已过时)。
- VGA-:不支持 VGA 兼容模式。
3)Capabilities:
- <access denied> 表示需要 root 权限才能查看扩展功能(如 PCIe 链路速度、电源管理等)。
2.4.2.6 内核驱动
- Kernel driver in use: pcieport
当前由 Linux 内核的 pcieport 驱动管理,该驱动负责处理 PCIe 端口和桥接器的通用功能(如热插拔、错误处理等)。
2.4.4 setpci
1)COMMAND 寄存器
在 PCIe 设备中,COMMAND 寄存器是一个 16位寄存器,控制设备的基本操作权限,其低 8 位的标志位控制设备的核心功能:
Bit Name Function
--------------------------------------------------------------------------------
0 I/O Space 启用设备对 I/O 端口 的访问(如 in/out 指令)
1 Memory Space 启用设备对 内存映射寄存器(MMIO) 的访问(如 BAR0/BAR1)
2 Bus Mastering 允许设备发起 DMA 操作(直接读写主机内存)
3-15 Others 如中断禁用、快速背靠背传输等(通常次要)
2)查看 Control 状态
>> sudo lspci -vv -s 01:00.0 | grep Control
---
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
说明当前设备 所有关键功能均未启用,无法访问它的内存或寄存器。
3)启用功能
>> sudo setpci -s 01:00.0 COMMAND=0x07
0x07 的二进制是 00000111,它同时启用:
- Bit 0 (I/O Space) = 1 → 允许 I/O 访问
- Bit 1 (Memory Space) = 1 → 允许 MMIO 访问
- Bit 2 (Bus Mastering) = 1 → 允许 DMA
为什么内核没有自动启用?
- 无专用驱动加载:内核检测到设备但未绑定驱动时,可能不会主动启用其功能。
- 安全策略限制:部分系统默认禁用未认证设备的 Bus Mastering(防 DMA 攻击)。
4)查看驱动加载情况
>> sudo dmesg | grep 9021
---
[ 3.80