好吧,我正在尝试为PCI Express编写设备驱动程序(任何PCI解决方案都会很棒)。在深入研究WindRiver文档后,对于其他VxWorks版本,找不到任何将虚拟映射到物理地址的解决方案。寻找类似于Linux的mmap(..)命令的东西。代码也将受到赞赏..
干杯,拉米
在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与资源[i] .handle和pDrvCtrl-> resource [i] .base参数来指示您有兴趣访问哪个基地址资源以及用于访问该架构的体系结构特定路径/机制资源。
通常,您不关心虚拟地址的实际值,但可以通过检查VXB_RESOURCE_ADR数据结构的成员来了解虚拟地址。在此示例中,pDrvCtrl-> resource [i] .base包含虚拟地址值。
最终结果是vxbResourceAlloc自动处理物理到虚拟地址的体系结构/板特定映射,并为您跟踪值。
vxbPciAutoConfig
读取hwconf.c提供的PCI参数。在您的BSP下搜索hwconf.c中的PCI_MEM_ADRS,PCI_MEMIO_ADRS,PCI_IO_ADRS和config.h。 -> pciDeviceShow
和-> pciHeaderShow
显示PCI配置。