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

📄 plxdrv.c

📁 vxworks下plx9050的pci驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
        	//plxdrv_printf("\nfind device %d ok\n",li); 
            }
            else
            {
             	break;
            }
    }// end of for loop
    
}// end of PciScanCards


/*******************************************************************************
* 	get the version
*/
LOCAL void Version(WD_VERSION *ver)
{
	ver->dwVer = WD_VER;
	
}


/*******************************************************************************
* 	get the Pci Card Information
*/
LOCAL void PciGetCardInfo (WD_PCI_CARD_INFO *pciCardInfo)
{	
	// null
	DWORD dwBus = pciCardInfo->pciSlot.dwBus;
	DWORD dwSlot = pciCardInfo->pciSlot.dwSlot;
	DWORD dwFunction = pciCardInfo->pciSlot.dwFunction;
	return;	
}


/*******************************************************************************
* 	reginster the card
*/
LOCAL void CardRegister(P9050_STRUCT_MY *hPlx)
{
	int 	i;
	
	int   pBusNo;
    	int   pDeviceNo;
    	int   pFuncNo;
    	
    	DWORD la;
    	DWORD lb;
	
	hPlx->cardReg.hCard = 1;
	
	pBusNo = hPlx->pciSlot.dwBus;
	pDeviceNo = hPlx->pciSlot.dwSlot;
	pFuncNo = hPlx->pciSlot.dwFunction;
	
	pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x10,&la);
        pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x10,&lb);
    	hPlx->addrDesc[0].dwLocalBase = 0;
    	hPlx->addrDesc[0].dwBytes = ( ~( lb & 0xfffffff0 ) + 1 );
    	hPlx->addrDesc[0].dwAddr = (la & 0xfffffff0 );
   	hPlx->addrDesc[0].dwAddrDirect = (la & 0xfffffff0 );
   	hPlx->addrDesc[0].fIsMemory = 1;
   	hPlx->addrDesc[0].dwMask =  ~( lb & 0xfffffff0 );        
        
                    
        pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x14,&la);
        pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x14,&lb);
    	hPlx->addrDesc[1].dwLocalBase = 0;
    	hPlx->addrDesc[1].dwBytes = ( ~( lb & 0xfffffffc ) + 1 );
    	hPlx->addrDesc[1].dwAddr = (la & 0xfffffffc );
   	hPlx->addrDesc[1].dwAddrDirect = 0;
   	hPlx->addrDesc[1].fIsMemory = 0;
   	hPlx->addrDesc[1].dwMask =  ~( lb & 0xfffffffc );                
        
        
        pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x18,&la);
        pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x18,&lb);
    	hPlx->addrDesc[2].dwLocalBase = 0;
    	hPlx->addrDesc[2].dwBytes = ( ~( lb & 0xfffffff0 ) + 1 );
    	hPlx->addrDesc[2].dwAddr = (la & 0xfffffff0 );
   	hPlx->addrDesc[2].dwAddrDirect = (la & 0xfffffff0 );
   	hPlx->addrDesc[2].fIsMemory = 1;
   	hPlx->addrDesc[2].dwMask =  ~( lb & 0xfffffff0 );   
   	
   	
   	for( i=0;i<3;i++)
   	{
   		printf("hPlx->addrDesc[%d].dwLocalBase is %x\n",i,hPlx->addrDesc[i].dwLocalBase);
   		printf("hPlx->addrDesc[%d].dwBytes is %x\n",i,hPlx->addrDesc[i].dwBytes);
   		printf("hPlx->addrDesc[%d].dwAddr is %x\n",i,hPlx->addrDesc[i].dwAddr);
   		printf("hPlx->addrDesc[%d].dwAddrDirect is %x\n",i,hPlx->addrDesc[i].dwAddrDirect);
   		printf("hPlx->addrDesc[%d].fIsMemory is %x\n",i,hPlx->addrDesc[i].fIsMemory);
   		printf("hPlx->addrDesc[%d].dwMask is %x\n",i,hPlx->addrDesc[i].dwMask);
   		
   	}
   	
}


/*******************************************************************************
* 	unresgister the card
*/

LOCAL void CardUnregister(P9050_STRUCT_MY *hPlx)
{
	hPlx->cardReg.hCard = 0;
	
}


/*******************************************************************************
* 	Pci  Config  Dump
*/

LOCAL void PciConfigDump(WD_PCI_CONFIG_DUMP *pciCnf)
{
    int li;
    
    for(li=0;li<pciCnf->dwBytes;li++)
    {
   	
    	if( pciCnf->fIsRead )
    	{
    		pciConfigInByte(pciCnf->pciSlot.dwBus,pciCnf->pciSlot.dwSlot,pciCnf->pciSlot.dwFunction,\
    				pciCnf->dwOffset,pciCnf->pBuffer);
    	}
    	else
    	{
		pciConfigOutByte(pciCnf->pciSlot.dwBus,pciCnf->pciSlot.dwSlot,pciCnf->pciSlot.dwFunction,\
    				pciCnf->dwOffset,*((BYTE *)pciCnf->pBuffer) );    		
    	}
    	
    	pciCnf->pBuffer++;
    	pciCnf->dwOffset++;
    	
    } // end of for loop
	
}//end of PciConfigDump


/*******************************************************************************
* 	Sleep 
*/
LOCAL void Sleep( WD_SLEEP *pParam )
{
	taskDelay( 0.1 );
}



/*******************************************************************************
* 	Transfer 
*/

LOCAL void Transfer(WD_TRANSFER *trans)
{
	int li;
	
	switch(trans->cmdTrans)
	{
		///////////////////////////////////////////////////////////////
		case	RP_BYTE:
			trans->Data.Byte = sysInByte( (BYTE *)trans->dwPort );
			break;
		
		case	RP_WORD:
			trans->Data.Word = sysInWord( (WORD *)trans->dwPort );
			break;

		case	RP_DWORD:
			trans->Data.Dword = sysInLong( (DWORD *)trans->dwPort );
			break;
		/////////////////
		case	WP_BYTE:
			sysOutByte(trans->dwPort,trans->Data.Byte);
			break;
		
		case	WP_WORD:
			sysOutWord(trans->dwPort,trans->Data.Word);
			break;

		case	WP_DWORD:
			sysOutLong(trans->dwPort,trans->Data.Dword);
			break;	
		
		
		////////////////////////////////////////////////////////////////
		case	RM_SBYTE:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = *( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	RM_SWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = *( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	RM_SDWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = *( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
		
		/////////////////////////
		case	WM_SBYTE:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)trans->dwPort ) = *( (BYTE *)(trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	WM_SWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)trans->dwPort ) = *( (BYTE *)(trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	WM_SDWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)trans->dwPort ) = *( (BYTE *)(trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;


		//////////////////////////////////////////////////////////////////////////
		case	RP_SBYTE:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = sysInByte( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	RP_SWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = sysInByte( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	RP_SDWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				*( (BYTE *)(trans->Data.pBuffer) ) = sysInByte( (BYTE *)trans->dwPort );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
		
		/////////////////////////
		case	WP_SBYTE:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				sysOutByte( (BYTE *)trans->dwPort,*((BYTE *)trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	WP_SWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				sysOutByte( (BYTE *)trans->dwPort,*((BYTE *)trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
			
		case	WP_SDWORD:
			trans->dwBytes *= 1;
			for( li = 0; li < trans->dwBytes; li++)
			{
				sysOutByte( (BYTE *)trans->dwPort,*((BYTE *)trans->Data.pBuffer) );
				(BYTE *)trans->Data.pBuffer++;
				(BYTE *)trans->dwPort++;
			}
			break;
		
		/////////////////////////////////////////////////////////////////////////////			
		default:
			plxdrv_printf("No such function!\n");
			
			break;
		
	}// end of switch
	
}// end of Transfer(WD_TRANSFER *trans)


/*******************************************************************************
* 	IntEnable 
*/
LOCAL int IntEnable( WD_INT *P9050_IntHandler )
{
	unsigned char irq_line;
	VOIDFUNCPTR* vector; 
	
	pciConfigInByte( P9050_IntHandler->pci.dwBus, P9050_IntHandler->pci.dwSlot, P9050_IntHandler->pci.dwFunction,\
			 PCI_ILR, &irq_line);
	plxdrv_printf("irq_line is 0x%x\n",irq_line);

	//irq_line = 0;//pgn++
	vector = INUM_TO_IVEC( irq_line + INT_NUM_IRQ0 );
	plxdrv_printf("vector is 0x%x\n",vector);
	
// pgn 20031226	sysPciIntConnect(vector, P9050_IntHandler->int_routine, irq_line);
	sysIntEnablePIC(irq_line);
	
	return 0;
}


/*******************************************************************************
* 	IntDisable 
*/
LOCAL int IntDisable( WD_INT *P9050_IntHandler )
{
	unsigned char irq_line;
	VOIDFUNCPTR* vector; 
	
	pciConfigInByte( P9050_IntHandler->pci.dwBus, P9050_IntHandler->pci.dwSlot, P9050_IntHandler->pci.dwFunction,\
			 PCI_ILR, &irq_line);
	plxdrv_printf("IntDisable irq_line is 0x%x\n",irq_line);
	
	//irq_line = 0;//pgn++
	vector = INUM_TO_IVEC( irq_line + INT_NUM_IRQ0 );
	plxdrv_printf("IntDisable vector is 0x%x\n",vector);
	 
	sysIntDisablePIC(irq_line);  
// pgn 20031226	sysPciIntDisconnect(vector, P9050_IntHandler->int_routine);
	
	return 0;		
}



STATUS pciConfigInAddressSpace
    (
    int busNo,          /* bus number */
    int deviceNo,       /* device number */
    int funcNo,         /* function number */
    int address,        /* address of the configuration space */
    int * pData         /* data read from the address */
    )
    {
    int savedData;
    int testData;
    int lockKey;
    STATUS result;


    pciConfigInLong (busNo, deviceNo, funcNo, address, 
             &savedData);

    testData = 0xffffffff;

    lockKey = intLock();
    pciConfigOutLong (busNo, deviceNo, funcNo, address, 
             testData);
    result = pciConfigInLong (busNo, deviceNo, funcNo, address, 
             pData);
    pciConfigOutLong (busNo, deviceNo, funcNo, address, 
             savedData);
    intUnlock(lockKey);

    return(result);
    }


⌨️ 快捷键说明

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