PCIE驱动学习笔记2

硬件平台:GV9531, PCIE控制器采用的是新思的IP核
软件平台:Linux 4.9

平台驱动初始化

芯片厂商封装IP厂商的数据结构

struct polaris_pcie {
    struct dw_pcie  *pci;             
    void __iomem    *wrapper_base;   // PCIe Wrapper Registers
    enum dw_pcie_device_mode mode;
    int reset_gpio;
};

数据结构dw_pcie是IP厂商对控制器的抽象数据 结构,polaris_pcie是芯片厂商博雅鸿图自定义的,对控制器的抽象。
由于控制器即可作为EP,也可以做为RC,故存在mode,用于分别是EP还是RC.
而wrapper_base显然是芯片厂商自定义封装的硬件模块控制的虚拟地址指针。

IP厂商定义的控制器抽象数据结构

struct dw_pcie {
	struct device		*dev; //指向平台设备内嵌的设备模型指针
	struct pcie_port	pp;   //用于RC
	struct dw_pcie_ep	ep;   //用于EP
	const struct dw_pcie_ops *op s; //ep和rc统一的函数操作集合

	void __iomem		*dbi_base;  //存储空间抽象指针
	void __iomem		*dbi_base2;

	u32			num_viewport;
	u8			iatu_unroll_enabled;
};

控制器驱动初始化

int polaris_pcie_probe(struct platform_device *pdev)
{
	struct polaris_pcie *polaris_pcie;
	struct dw_pcie *pci;
	
	polaris_pcie = devm_kzalloc(dev, sizeof(*polaris_pcie), GFP_KERNEL);
	pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
	
	pci->dev = dev;
	pci->ops = &polaris_pcie_ops;
	
	//设备树中获取
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wrapper");
    polaris_pcie->wrapper_base = devm_ioremap_resource(dev, res);

	 // iATU 0x300000
    // DMA 0x380000
    // So we map 0x400000 for DBI
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
    pci->dbi_base = devm_ioremap(dev, res->start, 0x400000);
   
    platform_set_drvdata(pdev, polaris_pcie);
	
	switch (polaris_pcie->mode) {
	case DW_PCIE_RC_TYPE:
		polaris_add_pcie_port(polaris_pcie, pdev);
		break;
	case DW_PCIE_EP_TYPE:
		polaris_add_pcie_ep(polaris_pcie, pdev);
		break;
	}
	return 0;
}

控制器IP核共同的处理函数集合

static const struct dw_pcie_ops polaris_pcie_ops = {
    .cpu_addr_fixup = polaris_pcie_cpu_addr_fixup,
	.read_dbi = polaris_pcie_read_dbi,
	.write_dbi = polaris_pcie_write_dbi,
	.link_up = polaris_pcie_link_up,
    .start_link = polaris_pcie_establish_link,
    .stop_link = polaris_pcie_stop_link,
};
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCIE-DMA是一种基于PCIe接口的直接内存访问技术,能够实现高速数据传输。在我的学习笔记中,我详细记录了与PCIE-DMA相关的知识和学习心得。 首先,我了解到PCIE-DMA技术的基本原理和作用。PCIE-DMA可以通过PCIe总线直接访问系统内存中的数据,而不需要过多的CPU干预,提高数据传输的速度和效率。这种技术在需要大量数据传输的场景下非常有效,比如高性能计算、数据采集等。 其次,我深入学习PCIE-DMA的工作原理。PCIE-DMA的核心是DMA控制器,它负责管理和控制数据传输的流程。当设备需要读写内存中的数据时,它通过DMA控制器发送请求,然后DMA控制器生成一个事务,将数据直接传输到或从内存中。这样就大大减少了CPU的参与,提高了数据传输的效率。 另外,我还学习PCIE-DMA的配置和编程方法。PCIE-DMA的配置主要包括硬件配置和软件配置两个部分。硬件配置通常涉及到DMA控制器和PCIe接口的初始化和配置,软件配置则需要编写驱动程序来驱动DMA控制器和处理数据传输过程中的事件和异常。这部分内容对于我来说还比较新颖,需要更多的实践和实践。 最后,我总结了PCIE-DMA的应用场景和发展前景。PCIE-DMA在高性能计算、数据采集等领域具有广阔的应用前景。随着数据量的不断增加和传输速度的要求越来越高,PCIE-DMA技术的需求也将越来越大。因此,对于我来说,学习掌握PCIE-DMA技术非常有价值。 通过学习和记录PCIE-DMA的相关知识和经验,我对这项技术有了更深入的理解和掌握。希望将来能通过应用PCIE-DMA技术解决实际问题,为科研和工程项目的顺利进行做出贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值