【发布时间】:2019-01-02 13:19:35
【问题描述】:
好吧,我正在尝试为 PCI express 编写设备驱动程序(任何 PCI 解决方案也都很棒)。在深入研究 WindRiver 文档后,对于其他 VxWorks 版本,找不到任何将虚拟地址映射到物理地址的解决方案。 寻找类似于 Linux 的 mmap(..) 命令的东西。 代码也将不胜感激..
干杯, 拉米
【问题讨论】:
标签: vxworks
好吧,我正在尝试为 PCI express 编写设备驱动程序(任何 PCI 解决方案也都很棒)。在深入研究 WindRiver 文档后,对于其他 VxWorks 版本,找不到任何将虚拟地址映射到物理地址的解决方案。 寻找类似于 Linux 的 mmap(..) 命令的东西。 代码也将不胜感激..
干杯, 拉米
【问题讨论】:
标签: vxworks
在 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 自动处理物理到虚拟地址的体系结构/板特定映射,并为您跟踪值。
【讨论】:
vxbPciAutoConfig读取hwconf.c提供的PCI参数。
在您的 BSP 下的 hwconf.c 和 config.h 中搜索 PCI_MEM_ADRS、PCI_MEMIO_ADRS、PCI_IO_ADRS。 -> pciDeviceShow 和 -> pciHeaderShow 显示 PCI 配置。
【讨论】: