PCIe总线-RK3588 PCIe平台驱动分析(十)

1.简介

RK3588 PCIe RC和EP使用同一个平台驱动,其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位,然后根据compatible属性初始化RC或者EP驱动。

2.入口

平台驱动的定义如下,当compatible属性为"rockchip,rk3588-pcie",则初始化RC驱动,当compatible属性为"rockchip,rk3588-pcie-ep",则初始化EP驱动。入口函数为rk_pcie_probe

[drivers/pci/controller/dwc/pcie-dw-rockchip.c]
static const struct rk_pcie_of_data rk_pcie_rc_of_data = {
	.mode = RK_PCIE_RC_TYPE,
};

static const struct rk_pcie_of_data rk_pcie_ep_of_data = {
	.mode = RK_PCIE_EP_TYPE,
};

static const struct of_device_id rk_pcie_of_match[] = {
	{
		.compatible = "rockchip,rk1808-pcie",
		.data = &rk_pcie_rc_of_data,
	},
	{
		.compatible = "rockchip,rk1808-pcie-ep",
		.data = &rk_pcie_ep_of_data,
	},
	{
		.compatible = "rockchip,rk3568-pcie",
		.data = &rk_pcie_rc_of_data,
	},
	{
		.compatible = "rockchip,rk3568-pcie-ep",
		.data = &rk_pcie_ep_of_data,
	},
	{
		.compatible = "rockchip,rk3588-pcie",
		.data = &rk_pcie_rc_of_data,
	},
	{
		.compatible = "rockchip,rk3588-pcie-ep",
		.data = &rk_pcie_ep_of_data,
	},
	{},
};

MODULE_DEVICE_TABLE(of, rk_pcie_of_match);
static struct platform_driver rk_plat_pcie_driver = {
	.driver = {
		.name	= "rk-pcie",
		.of_match_table = rk_pcie_of_match,
		.suppress_bind_attrs = true,
		.pm = &rockchip_dw_pcie_pm_ops,
	},
	.probe = rk_pcie_probe,
};

module_platform_driver(rk_plat_pcie_driver);

3.初始化流程

驱动的初始化函数rk_pcie_probe可以直接调用,也可以放在内核线程执行(配置CONFIG_PCIE_RK_THREADED_INIT选项)。rk_pcie_probe函数的执行流程如下图所示,主要的工作有:

  1. 设置dw_pcie_ops回调函数,主要用于开始链路循环和查询链路训练是否成功
  2. 从设备树中解析并处理资源,如解析并映射"pcie-dbi"、"pcie-apb"地址,获取PERST#的GPIO和延时时间,延时时间默认为200毫秒。
  3. 获取sys中断编号,注册sys中断处理函数。sys中断的处理函数为rk_pcie_sys_irq_handler
  4. 创建处理INTx中断的irq_domain,将INTx中断映射为虚拟中断。
  5. 获取legacy中断(INTx)编号,注册legacy中断处理函数。同时屏蔽所有INTx中断。legacy中断的处理函数为rk_pcie_legacy_int_handler
  6. 根据设备树配置的模式,设置PCIe模式(通过PCIE_CLIENT_GENERAL_CON寄存器设置)。RC模式,还需要配置CLKREQ#,disable L1 PM Substates。
  7. RC模式,调用rk_add_pcie_port函数初始化。
  8. EP模式,调用rk_pcie_add_ep函数初始化。
  9. 配置DMA功能。

平台驱动初始化流程

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI Express® Base Specification Revision 5.0 Version 1.0
  4. Rockchip RK3588 TRM
  5. PCI Express® Base Specification Revision 5.0 Version 1.0
  6. Rockchip RK3588 TRM
  7. Linux kernel 5.10
### RK3588 PCIe Endpoint 开发指南 RK3588 是一款高性能处理器,支持多种外设接口,其中包括 PCI Express (PCIe) 接口。对于 PCIe 的开发,尤其是作为 Endpoint (EP) 模式的配置和实现,开发者通常需要参考官方的技术手册以及相关的开源项目资源。 #### 官方技术文档 Rockchip 提供了详细的硬件参考手册和技术资料来指导开发者完成 PCIe 配置工作。这些文档涵盖了从初始化到性能优化的各个方面[^3]。具体来说: - **《RK3588 Hardware Reference Manual》**:该手册提供了关于 PCIe 控制器架构、寄存器映射及其功能描述的信息。 - **《RK3588 Software Development Guide》**:此文档重点介绍了如何通过软件设置使能 PCIe 功能,并提供了一些典型的驱动程序设计案例。 #### 软件栈与工具链 为了简化 PCIe EP 模式下的开发流程,可以利用 Linux 内核中的现有框架来进行快速原型验证。例如,在基于 ARM 架构的操作系统上运行时,可以通过修改设备树文件(Device Tree Source, DTS)定义 PCIe 的物理连接属性并加载相应的驱动模块[^4]。 以下是针对 RK3588 平台的一个简单示例代码片段用于演示如何启用 PCIe EP 设备节点: ```dts &pcie { status = "okay"; #address-cells = <1>; #size-cells = <0>; ep@0 { compatible = "rockchip,rk3588-pcie-ep"; reg = <0>; /* Lane 0 */ interrupts-extended = <&gic GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>; }; }; ``` 上述代码展示了如何声明一个名为 `ep` 的子节点代表 PCIe EndPoint 实体,并指定了其所在通道号以及其他必要的中断参数等信息[^5]。 #### 测试环境搭建建议 构建完整的测试平台还需要考虑以下几个方面因素: - 使用专用调试板卡或者 FPGA 板模拟 Root Complex(RC),以便于观察双方交互过程; - 借助协议分析仪捕获实际通信数据流以排查潜在错误源; - 结合 QEMU 或其他虚拟化解决方案仿真目标场景从而加速迭代周期。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值