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