如何在VxWorks 7.0中将PCI / PCIe虚拟映射到物理内存?

时间:2019-01-02 13:19:35

标签: vxworks

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

干杯, 拉米

2 个答案:

答案 0 :(得分: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自动处理了物理地址到虚拟地址的特定于体系结构/板的映射,并为您跟踪值。

答案 1 :(得分:0)

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