【问题标题】:How to map PCI / PCIe virtual to physical memory in VxWorks 7.0?如何在 VxWorks 7.0 中将 PCI / PCIe 虚拟映射到物理内存?
【发布时间】:2019-01-02 13:19:35
【问题描述】:

好吧,我正在尝试为 PCI express 编写设备驱动程序(任何 PCI 解决方案也都很棒)。在深入研究 WindRiver 文档后,对于其他 VxWorks 版本,找不到任何将虚拟地址映射到物理地址的解决方案。 寻找类似于 Linux 的 mmap(..) 命令的东西。 代码也将不胜感激..

干杯, 拉米

【问题讨论】:

    标签: vxworks


    【解决方案1】:

    在 VxWorks 7 中,首选方法是实现 vxbus 设备驱动程序。在驱动程序中,您将有一段代码大致如下所示;取决于您感兴趣的 PCI 基地址寄存器的数量。

    for (i = 0; i < VXB_MAXBARS; i++)
        {
        pRes = vxbResourceAlloc (pDev, VXB_RES_MEMORY, i);
        if (pRes != NULL)
            {
            pResAdr = (VXB_RESOURCE_ADR *)pRes->pRes;
            if (pResAdr != NULL)
                {
                pDrvCtrl->resource[i].handle = pResAdr->pHandle;
                pDrvCtrl->resource[i].base = (void *)pResAdr->virtual;
                pDrvCtrl->resource[i].res = pRes;
                break;
                }
            else
                {
                (void) vxbResourceFree (pDev, pRes);
                }
            }
        }
    

    稍后,您可以将 vxbRead32 和/或 vxbWrite32 与 resource[i].handle 和 pDrvCtrl->resource[i].base 参数一起使用,以指示您有兴趣访问的基地址资源以及特定于体系结构的路径/机制用于访问资源。

    通常,您不关心虚拟地址的实际值,但可以通过检查 VXB_RESOURCE_ADR 数据结构的成员来知道虚拟地址。在本例中,pDrvCtrl->resource[i].base 包含虚拟地址值。

    最终结果是 vxbResourceAlloc 自动处理物理到虚拟地址的体系结构/板特定映射,并为您跟踪值。

    【讨论】:

      【解决方案2】:

      vxbPciAutoConfig读取hwconf.c提供的PCI参数。 在您的 BSP 下的 hwconf.c 和 config.h 中搜索 PCI_MEM_ADRS、PCI_MEMIO_ADRS、PCI_IO_ADRS。 -&gt; pciDeviceShow-&gt; pciHeaderShow 显示 PCI 配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多