本文讲解了VxWorks操作系统下的PCI总线下的设备相关操作方法以及实现代码!
源程序文件:
vxConfPciDevice.c
函数功能:

已知该类PCI设备的Vendor号,Device号和索引号myIndex,查找出该类PCI设备的MEMORY地址

和IO地址,以及中断级,并添加第一个MEMORY的物理地址到虚拟地址的映射。

调用实例
如果有4块该类PCI设备,则调用四次函数,索引号从0~3,如下:
    for (myIndex=0; myIndex<4; myIndex++)
    {
        myStatus = vxfConfPciDevice(vendorId, devId, myIndex);
    }

 
 
/* 
modification history 
-------------------- 
21aug03,ghb 添加函数功能及调用说明。 
*/ 
 
#include "vxWorks.h" 
#include "stdio.h" 
#include "sysLib.h" 
#include "stdlib.h" 
#include "config.h" 
 
#include  
#include  
 
#ifndef PCI_DEV_MMU_MSK 
#define PCI_DEV_MMU_MSK (~(VM_PAGE_SIZE - 1)) /* Mask MMU page */ 
#endif /* PCI_DEV_MMU_MSK */ 
 
/* 外部函数原型 */ 
extern STATUS sysMmuMapAdd 
    ( 
    void * address, 
    UINT length, 
    UINT initialStateMask, 
    UINT initialState 
    ); 
 
/********************************************************************************** 
* vxConfPciDevice 
* 
* 已知该类PCI设备的Vendor号,Device号和索引号myIndex,查找出该类PCI设备的MEMORY地址 
* 和IO地址,以及中断级,并添加第一个MEMORY的物理地址到虚拟地址的映射。 
* 
* Parameter: 
* vendorId:该类PCI设备的Vendor号 
* devId:该类PCI设备的Device号 
* myIndex:该类PCI设备的索引号 
* 
* Return: 
* OK:查找并映射成功 
* ERROR: 查找或映射不成功 
* 
*/ 
 
STATUS vxConfPciDevice(int vendorId, int devId, int myIndex) 
{ 
 int busno, devno, funcno; 
 int membaseCsr0, membaseCsr1, iobaseCsr; 
 unsigned char irq; 
 STATUS myStatus; 
  
 /* 查找PCI设备 */ 
 myStatus = pciFindDevice(vendorId, devId, myIndex,  
     (int *)&busno, (int *)&devno, (int *)&funcno); 
      
 if (myStatus == OK) /* 找到该类PCI设备 */ 
 { 
    pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_0, &membaseCsr0); 
    pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_1, &membaseCsr1); 
    pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_2, &iobaseCsr); 
/* pciConfigInByte (busno, devno, funcno, PCI_CFG_DEV_INT_LINE, &irq);*/ 
    membaseCsr0 = membaseCsr0 & (~0x0000000f)/*PCI_MEMBASE_MASK*/; 
    membaseCsr1 = membaseCsr1 & (~0x0000000f)/*PCI_MEMBASE_MASK*/; 
/* iobaseCsr = iobaseCsr & PCI_IOBASE_MASK;*/ 
 
    printf("\nbusno=%d, devno=%d, funcno=%d, membaseCsr0=%x, membaseCsr1=%x, iobaseCsr=%d\n",  
    busno, devno, funcno, membaseCsr0, membaseCsr1, iobaseCsr); 
 
#ifdef INCLUDE_MMU_BASIC 
    if (sysMmuMapAdd((void *)(membaseCsr0 & PCI_DEV_MMU_MSK), 0x200000,  
    VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | 
         VM_STATE_MASK_CACHEABLE, 
         VM_STATE_VALID | VM_STATE_WRITABLE | 
         VM_STATE_CACHEABLE_NOT) == ERROR) 
        { 
         printf("\nGHB_VRAM error\n"); 
         return ERROR; 
        }; 
#endif /* INCLUDE_MMU_BASIC */ 
 
    /* 最后一个参数' | PCI_CMD_MASTER_ENABLE'好像可有可无,没有影响 */ 
    pciConfigOutWord (busno, devno, funcno, 
                    PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE | 
                    PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE); 
    return OK; 
 }  
 else 
 { 
    printf("\nFind VRAM device error\n"); 
    return ERROR; 
 } 
}