目录
一、PCIE RC驱动初始化流程
PCI子系统初始化 + Host Bridge注册 + 总线扫描 + 设备枚举
1.1 获取关键资源
DBI寄存器(配置空间)
ATU(地址转换单元)
IO/MEM窗口
IRQ(MSI / INTx)
1.2 使能硬件资源
clk enable
reset deassert:把设备从复位状态释放出来”
power on
PHY初始化
对应电平:
assert:通常是 拉低(或拉高,取决于设计)
deassert:恢复正常电平
1.3 建立ATU(地址转换)
RC必须配置 outbound ATU:
dw_pcie_prog_outbound_atu(…)
作用:
CPU地址 → PCIe地址(访问EP配置空间/内存)
1.4 设置为RC模式
dw_pcie_setup_rc(pp);
主要做:
设置 class code(PCI_CLASS_BRIDGE_PCI)
配置 BAR0(DBI)
打开 LTSSM(链路训练)
1.5 驱动解析
PCIe扫描EP设备流程(核心):
总流程
pci_scan_root_bus_bridge
└── pci_scan_child_bus
└── pci_scan_slot
└── pci_scan_single_device
└── pci_bus_read_config
RC probe
├── 硬件初始化(clk/reset/phy)
├── 配置ATU
├── 建立Host Bridge
├── 启动链路(LTSSM)
└── pci_scan_root_bus
├── 枚举Bus
├── 读取Vendor ID
├── 创建pci_dev
├── 解析BAR
├── 分配资源
└── 驱动匹配
二、RC与EP初始化时序
2.1 要点
- REFCLK 和 电源必须先稳定
- PERST# 必须先保持 Assert(EP处于复位)
- RC 初始化完成后,再释放 PERST#
- EP 启动后,RC 才能开始 LTSSM 建链
RC准备好 → 放开EP(PERST#)→ 双方PHY开始训练
2.2 时间轴
电源 ────────────────稳定────────────────────
REFCLK ────────────────稳定────────────────────
PERST# ────────0───────────────┐
↓
释放(1)
RC 初始化中 ───────────→ Ready
EP Reset状态 ───────→ 启动 → Ready
LTSSM Detect → L0
扫描 pci scan
2.3 详细过程讲解
-
上电阶段
t0: 电源稳定(VDD)
t1: REFCLK稳定
t2: PERST# = 0(保持复位)
此时:
EP不工作
RC可以初始化自己 -
RC初始化阶段
RC做:
初始化控制器
初始化 PHY
配置 ATU
准备好 LTSSM -
释放 PERST#(关键点)
t3: PERST# 从 0 → 1(deassert)
要求:
REFCLK稳定后至少100ms(典型值) -
EP启动阶段
PERST#释放后:
EP开始内部初始化
配置空间可访问
PHY ready -
链路训练(LTSSM)
Detect → Polling → Config → L0
这时:
RC PHY -> EP PHY 开始通信 -
枚举阶段
RC开始:
pci_scan_root_bus()

2553

被折叠的 条评论
为什么被折叠?



