⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 surfconfpcidevice.c

📁 显存地址映射。只要知道该类PCI设备的Vendor号
💻 C
字号:
/*      surfConfPciDevice.c        */

/*
* 函数功能:
***********
* 已知该类PCI设备的Vendor号,Device号和索引号myIndex,查找出该类PCI设备的MEMORY地址
* 和IO地址,以及中断级,并添加第一个MEMORY的物理地址到虚拟地址的映射。
*
* 调用实例:
***********
* 如果有4块该类PCI设备,则调用四次函数,索引号从0~3,如下:
    for (myIndex=0; myIndex<4; myIndex++)
    {
        myStatus = surfConfPciDevice(vendorId, devId, myIndex);
    }
*/

/*
modification history
--------------------
21aug03,ghb 添加函数功能及调用说明。
*/

#include <vxWorks.h>
#include <stdio.h>
#include <sysLib.h>
#include <stdlib.h>
#include <config.h>

#include <drv/pci/pciConfigLib.h>
#include <vmLib.h>
#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    );
/**********************************************************************************
* surfConfPciDevice
*
* 已知该类PCI设备的Vendor号,Device号和索引号myIndex,查找出该类PCI设备的MEMORY地址
* 和IO地址,以及中断级,并添加第一个MEMORY的物理地址到虚拟地址的映射。
*
* Parameter:
*  vendorId:该类PCI设备的Vendor号
*  devId:该类PCI设备的Device号
*  myIndex:该类PCI设备的索引号
*
* Return:
*  OK:查找并映射成功
*  ERROR: 查找或映射不成功
*
*/
STATUS surfConfPciDevice(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;
	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -