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

📄 pspandrv.c

📁 powerspan pci slave device driver
💻 C
📖 第 1 页 / 共 2 页
字号:
    
    
    		
    DWORD dwVendorID = pciScan->searchId.dwVendorId;
    DWORD dwDeviceID = pciScan->searchId.dwDeviceId;

    pciScan->dwCards = 0;
    
    for(li = 0; li<32;li++)
    {
        	if( pciFindDevice(dwVendorID,dwDeviceID,li,&pBusNo,&pDeviceNo,&pFuncNo)==0)
	    	{
	    		pciScan->dwCards++;
	    	
	    		pciScan->cardSlot[li].dwBus = pBusNo;
	    		pciScan->cardSlot[li].dwSlot = pDeviceNo;
	    		pciScan->cardSlot[li].dwFunction = pFuncNo;
	    	
        	//pspandrv_printf("\nfind device %d ok\n",li); 
            }
            else
            {
             	break;
            }
    }// end of for loop
    
}// end of PciScanCards_pspan


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


/*******************************************************************************
* 	get the Pci Card Information
*/
LOCAL void PciGetCardInfo_pspan (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_pspan(PSPAN_STRUCT_MY *hPlx)
{
	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 & 0xfffffff0 ) + 1 );
    	hPlx->addrDesc[1].dwAddr = (la & 0xfffffff0 );
   	hPlx->addrDesc[1].dwAddrDirect = (la & 0xfffffff0 );
   	hPlx->addrDesc[1].fIsMemory = 1;
   	hPlx->addrDesc[1].dwMask =  ~( lb & 0xfffffff0 );                
        
        
        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 );    
   	
        pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x1c,&la);
        pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x1c,&lb);
    	hPlx->addrDesc[3].dwLocalBase = 0;
    	hPlx->addrDesc[3].dwBytes = ( ~( lb & 0xfffffff0 ) + 1 );
    	hPlx->addrDesc[3].dwAddr = (la & 0xfffffff0 );
   	hPlx->addrDesc[3].dwAddrDirect = (la & 0xfffffff0 );
   	hPlx->addrDesc[3].fIsMemory = 1;
   	hPlx->addrDesc[3].dwMask =  ~( lb & 0xfffffff0 );       	
   	
}


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

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


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

LOCAL void PciConfigDump_pspan(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_pspan


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



/*******************************************************************************
* 	Transfer_pspan 
*/

LOCAL void Transfer_pspan(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:
			pspandrv_printf("No such function!\n");
			
			break;
		
	}// end of switch
	
}// end of Transfer_pspan(WD_TRANSFER *trans)


/*******************************************************************************
* 	IntEnable_pspan 
*/
LOCAL int IntEnable_pspan( WD_INT *PSPAN_IntHandler )
{
    
	unsigned char irq_line;
	VOIDFUNCPTR* vector; 
	
	pciConfigInByte( PSPAN_IntHandler->pci.dwBus, PSPAN_IntHandler->pci.dwSlot, PSPAN_IntHandler->pci.dwFunction,\
			 PCI_ILR, &irq_line);
	pspandrv_printf("irq_line is 0x%x\n",irq_line);
    
	//irq_line = 0;//pgn++
	vector = INUM_TO_IVEC( irq_line + INT_NUM_IRQ0 );   
	pspandrv_printf("vector is 0x%x\n",vector);
	
	sysPciIntConnect(vector, PSPAN_IntHandler->int_routine, PSPAN_IntHandler->params); 
	sysIntEnablePIC(irq_line);
	
	return 0;
	
		
}


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

⌨️ 快捷键说明

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