PCIe Root Complex 驱动开发与设备树配置实战解析

1. PCIe Root Complex 驱动开发基础

PCIe Root Complex(RC)是PCIe体系结构中的核心组件,负责连接CPU和内存子系统到PCIe设备。在Linux驱动开发中,RC驱动的主要职责包括初始化硬件、配置地址空间、处理中断和DMA传输。与Endpoint(EP)驱动不同,RC驱动需要管理整个PCIe总线拓扑,包括总线枚举、资源分配和设备热插拔。

在实际项目中,我经常看到开发者混淆RC和EP的概念。简单来说,RC是PCIe拓扑的“根”,而EP是连接到总线的“叶子”设备。例如,在Xilinx平台上,AXI PCIe IP可以配置为RC模式,此时FPGA作为主机控制PCIe总线上的其他设备。

RC驱动的开发通常从硬件初始化开始。以Xilinx AXI PCIe IP为例,首先需要配置控制器的基本参数:

// 初始化PCIe控制器
static int xilinx_pcie_init(struct pcie_port *pp)
{
    struct xilinx_pcie *pcie = to_xilinx_pcie(pp);
    u32 val;
    
    // 配置PCIe控制器寄存器
    val = pcie_read(pcie, XILINX_PCIE_REG_PSCR);
    val |= XILINX_PCIE_PSCR_LNKUP;
    pcie_write(pcie, val, XILINX_PCIE_REG_PSCR);
    
    // 启用总线主控和内存空间
    pcie_write(pcie, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY,
               pcie->dbi_base + PCI_COMMAND);
    
    return 0;
}

这段代码展示了如何初始化PCIe控制器的基本寄存器。在实际项目中,你还需要处理更多细节,比如配置ATU(地址转换单元)、设置中断和DMA等。

2. 设备树关键参数配置解析

设备树(Device Tree)是嵌入式Linux系统中描述硬件配置的重要机制。对于PCIe RC驱动,设备树中的配置参数直接影响控制器的行为和性能。以下是几个关键参数的详细解析:

ranges属性:这是PCIe设备树中最复杂的参数之一,它定义了CPU地址空间到PCI地址空间的映射关系。每个ranges条目包含7个字段:PCI地址标志、PCI地址高32位、PCI地址低32位、CPU地址高32位、CPU地址低32位、长度高32位和长度低32位。

pcie@fe150000 {
    #address-cells = <3>;
    #size-cells = <2>;
    ranges = <0x01000000 0x0 0x00000000 0x0 0xf7000000 0x0 0x00100000   // I/O空间
              0x42000000 0x0 0xc0000000 0x0 0xc0000000 0x0 0x10000000   // 预取内存
              0x02000000 0x0 0xd0000000 0x0 0xd0000000 0x0 0x10000000>; // 非预取内存
};

在这个示例中,第一个条目将PCI的I/O空间映射到CPU的0xf7000000地址,大小为1MB。第二个条目将PCI的预取内存映射到CPU的0xc0000000,大小为256MB。第三个条目映射非预取内存。

中断映射:PCIe设备使用消息信号中断(MSI)或传统INTx中断。设备树中的interrupt-map属性定义了如何将PCI设备的INTx中断映射到系统中断控制器。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值