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

📄 p9050_lib.c

📁 powerspan pci slave device driver
💻 C
📖 第 1 页 / 共 3 页
字号:
                }
                if (ad_sp<=P9050_ADDR_EPROM)
                {
                    DWORD j;
                    hPlx->addrDesc[ad_sp].dwBytes = dwBytes;
                    hPlx->addrDesc[ad_sp].dwAddr = dwAddr;
                    hPlx->addrDesc[ad_sp].dwAddrDirect = dwAddrDirect;
                    hPlx->addrDesc[ad_sp].fIsMemory = fIsMemory;
                    hPlx->addrDesc[ad_sp].dwMask = 0;
                    for (j=1; j<hPlx->addrDesc[ad_sp].dwBytes && j!=0x80000000; j *= 2)  
                    {
                        hPlx->addrDesc[ad_sp].dwMask = 
                            (hPlx->addrDesc[ad_sp].dwMask << 1) | 1;
                            
                    }
                    
                    // added begin by pgn for debug use
		    printf(" hPlx->addrDesc[0x%d].dwBytes is 0x%x\n", ad_sp,hPlx->addrDesc[ad_sp].dwBytes);
		    printf(" hPlx->addrDesc[0x%d].dwAddr is 0x%x\n", ad_sp,hPlx->addrDesc[ad_sp].dwAddr);
		    printf(" hPlx->addrDesc[0x%d].dwAddrDirect is 0x%x\n", ad_sp,hPlx->addrDesc[ad_sp].dwAddrDirect);
		    printf(" hPlx->addrDesc[0x%d].fIsMemory is 0x%x\n", ad_sp,hPlx->addrDesc[ad_sp].fIsMemory);
		    printf(" hPlx->addrDesc[0x%d].dwMask is 0x%x\n", ad_sp,hPlx->addrDesc[ad_sp].dwMask);
		    printf("\n\n"); 
		    // added end by pgn
                }
            
            }
            break;
            
        case ITEM_INTERRUPT:
            if (hPlx->Int.Int.hInterrupt) return FALSE;
            hPlx->Int.Int.hInterrupt = pItem->I.Int.hInterrupt;
            
            // added begin by pgn for debug use 
            printf("pItem->I.Int.dwInterrupt is 0x%x.\n",pItem->I.Int.dwInterrupt);
            printf("pItem->I.Int.dwOptions is 0x%x.\n",pItem->I.Int.dwOptions);
            printf("pItem->I.Int.hInterrupt is 0x%x.\n\n",pItem->I.Int.hInterrupt);
            // added end by pgn
            
            
            break;
        }
    }

    // check that all the items needed were found
    // check if interrupt found
    if (!hPlx->Int.Int.hInterrupt) 
        return FALSE;

    // check that the registers space was found
    if (!P9050_IsAddrSpaceActive(hPlx, P9050_ADDR_REG))
            //|| hPlx->addrDesc[P9050_ADDR_REG].dwBytes!=P9050_RANGE_REG)
        return FALSE;

    // check that at least one memory space was found
    // for (i = P9050_ADDR_SPACE0; i<=P9050_ADDR_EPROM; i++)
    //     if (P9050_IsAddrSpaceActive(hPlx, i)) break;
    // if (i>P9050_ADDR_EPROM) return FALSE;

    return TRUE;
    */
}

void P9050_Close(P9050_HANDLE hPlx)
{
    /*
    // disable interrupts
    if (P9050_IntIsEnabled(hPlx))
        P9050_IntDisable(hPlx);

    // unregister card
    if (hPlx->cardReg.hCard) 
        WD_CardUnregister(hPlx->hWD, &hPlx->cardReg);
    */
	
    // close DriverBuilder
    WD_Close(hPlx->hWD);

    free (hPlx);
}

BOOL P9050_IsAddrSpaceActive(P9050_HANDLE hPlx, P9050_ADDR addrSpace)
{
    return hPlx->addrDesc[addrSpace].dwAddr!=0;
}

DWORD P9050_ReadReg (P9050_HANDLE hPlx, DWORD dwReg)
{
    return P9050_ReadSpaceDWord(hPlx, P9050_ADDR_REG, dwReg);
}

void P9050_WriteReg (P9050_HANDLE hPlx, DWORD dwReg, DWORD dwData)
{
    P9050_WriteSpaceDWord(hPlx, P9050_ADDR_REG, dwReg, dwData);
}

void P9050_SetMode (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwLocalAddr)
{
    DWORD dwRegOffset = 4*(addrSpace-P9050_ADDR_SPACE0);
    P9050_ADDR_DESC *addrDesc = &hPlx->addrDesc[addrSpace];
    addrDesc->dwLocalBase = dwLocalAddr & ~addrDesc->dwMask;
    addrDesc->dwLocalBase |= BIT0;
    P9050_WriteReg (hPlx, P9050_LAS0BA + dwRegOffset, addrDesc->dwLocalBase);
}

BYTE P9050_ReadSpaceByte (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset)
{
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        BYTE *pByte = (BYTE *) dwAddr;
        return *pByte;
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = RP_BYTE;
        trans.dwPort = dwAddr;
        WD_Transfer (hPlx->hWD, &trans);
        return trans.Data.Byte;
    }
}

void P9050_WriteSpaceByte (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset, BYTE data)
{
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        BYTE *pByte = (BYTE *) dwAddr;
        *pByte = data;
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = WP_BYTE;
        trans.dwPort = dwAddr;
        trans.Data.Byte = data;
        WD_Transfer (hPlx->hWD, &trans);
    }
}


WORD P9050_ReadSpaceWord (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset)
{
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        WORD *pWord = (WORD *) dwAddr;
        return *pWord;
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = RP_WORD;
        trans.dwPort = dwAddr;
        WD_Transfer (hPlx->hWD, &trans);
        return trans.Data.Word;
    }
}


void P9050_WriteSpaceWord (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset, WORD data)
{
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        WORD *pWord = (WORD *) dwAddr;
        *pWord = data;
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = WP_WORD;
        trans.dwPort = dwAddr;
        trans.Data.Word = data;
        WD_Transfer (hPlx->hWD, &trans);
    }
    
}

DWORD P9050_ReadSpaceDWord (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset)
{
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        DWORD *pDword = (DWORD *) dwAddr;
        return *pDword;
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        /*
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = RP_DWORD;
        trans.dwPort = dwAddr;
        WD_Transfer (hPlx->hWD, &trans);
        return trans.Data.Dword;
        */
        // replaced by pgn
        return sysInLong( (DWORD *)(dwAddr) );  
           
    }
}


void P9050_WriteSpaceDWord (P9050_HANDLE hPlx, P9050_ADDR addrSpace, DWORD dwOffset, DWORD data)
{

    int li;
    long ll;
    
    int number;
    short pVendorId;
    short pDeviceId;
    int   pBusNo;
    int   pDeviceNo;
    int   pFuncNo;
     
    if (hPlx->addrDesc[addrSpace].fIsMemory)
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddrDirect + dwOffset;
        DWORD *pDword = (DWORD *) dwAddr;
        *pDword = data;
        
	/*        
        // for debug use added begin by pgn
        printf("hPlx->addrDesc[0x%x].fIsMemory is 0x%x.\n",addrSpace,hPlx->addrDesc[addrSpace].fIsMemory);
        for(li = 0;li<256;li+=4)
        {
       	 	data = *( (DWORD *)(dwAddr-dwOffset+li) );
        	printf("dwAddr = 0x%x,data = 0x%x\n",dwAddr-dwOffset+li,data);
        }  
        // added end by pgn
        */
        
        
        
    }
    else
    {
        DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;
        /*
        WD_TRANSFER trans;
        BZERO(trans);
        trans.cmdTrans = WP_DWORD;
        trans.dwPort = dwAddr;
        trans.Data.Dword = data;
        WD_Transfer (hPlx->hWD, &trans);
        */
        // replaced by pgn
        sysOutLong(dwAddr,data);
        
        
        /*
        // added begin by pgn    
        // for debug use 
        printf("P9050_WriteSpaceDWord has run.\n");
        printf("hPlx->addrDesc[0x%x].fIsMemory is 0x%x.\n",addrSpace,hPlx->addrDesc[addrSpace].fIsMemory);
        for(li = 0;li<256;li+=4)
        {
       	 	data = sysInLong( (DWORD *)(dwAddr-dwOffset+li) );
        	printf("dwAddr = 0x%x,data = 0x%x\n",dwAddr-dwOffset+li,data);
        }
        // added end by pgn
        */
        
        
	/*
	// added begin by pgn
	for(number=0;number<32;number++)
	{
   	     if( pciGetDeviceNum(number,&pVendorId,&pDeviceId,&pBusNo,&pDeviceNo,&pFuncNo) == 0 )
 	     {
 	       	 printf("\n%d\n",number);
 		 printf("pVendorId is 0x%x.\n",pVendorId);
 		 printf("pDeviceId is 0x%x.\n",pDeviceId);
	  	 printf("pBusNo is 0x%x.\n",pBusNo);
		 printf("pDeviceNo is 0x%x.\n",pDeviceNo);
    		 printf("pFuncNo is 0x%x.\n",pFuncNo);
            }
            else
            {
            	 printf("\nerror%d\n",number);
            }
        
        
	    if( pciFindDevice(0x14f8,0x2091,number,&pBusNo,&pDeviceNo,&pFuncNo)==0)
	    {
   	    	printf("_pBusNo is 0x%x.\n",pBusNo);
  	        printf("_pDeviceNo is 0x%x.\n",pDeviceNo);
  	        printf("_pFuncNo is 0x%x.\n",pFuncNo);

	        pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x10,&ll);
        	printf("_hPlx->addrDesc[0].dwAddr is 0x%x\n",ll);
        	pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x10,&li);
        	printf("_hPlx->addrDesc[0].dwbytes is 0x%x\n",li);
                    
        	pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x14,&ll);
        	printf("_hPlx->addrDesc[1].dwAddr is 0x%x\n",ll);
        	pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x14,&li);
        	printf("_hPlx->addrDesc[1].dwbytes is 0x%x\n",li);
        
        	pciConfigInLong(pBusNo,pDeviceNo,pFuncNo,0x18,&ll);
        	printf("_hPlx->addrDesc[2].dwAddr is 0x%x\n",ll);
        	pciConfigInAddressSpace(pBusNo,pDeviceNo,pFuncNo,0x18,&li);
        	printf("_hPlx->addrDesc[2].dwbytes is 0x%x\n",li); 
        	
        	printf("\nfind device %d ok\n",number); 
             }
             else
             {
              	printf("find device %d error\n",number);
              	
             }
             
        }        
        // Added end by pgn
        */
        
    }
    
}



void P9050_ReadWriteSpaceBlock (P9050_HANDLE hPlx, DWORD dwOffset, PVOID buf, 
                    DWORD dwBytes, BOOL fIsRead, P9050_ADDR addrSpace, P9050_MODE mode)
{
    WD_TRANSFER trans;
    DWORD dwAddr = hPlx->addrDesc[addrSpace].dwAddr + dwOffset;

    BZERO(trans);

    if (hPlx->addrDesc[addrSpace].fIsMemory) 
    {
        if (fIsRead) 
        {
            if (mode==P9050_MODE_BYTE) trans.cmdTrans = RM_SBYTE;
            else if (mode==P9050_MODE_WORD) trans.cmdTrans = RM_SWORD;
            else trans.cmdTrans = RM_SDWORD;
        }
        else 
        {
            if (mode==P9050_MODE_BYTE) trans.cmdTrans = WM_SBYTE;
            else if (mode==P9050_MODE_WORD) trans.cmdTrans = WM_SWORD;
            else trans.cmdTrans = WM_SDWORD;
        }
    }
    else 
    {
        if (fIsRead) 
        {
            if (mode==P9050_MODE_BYTE) trans.cmdTrans = RP_SBYTE;
            else if (mode==P9050_MODE_WORD) trans.cmdTrans = RP_SWORD;
            else trans.cmdTrans = RP_SDWORD;
        }
        else 
        {
            if (mode==P9050_MODE_BYTE) trans.cmdTrans = WP_SBYTE;
            else if (mode==P9050_MODE_WORD) trans.cmdTrans = WP_SWORD;
            else trans.cmdTrans = WP_SDWORD;
        }
    }
    
    trans.dwPort = dwAddr;
    trans.fAutoinc = TRUE;
    trans.dwBytes = dwBytes;

⌨️ 快捷键说明

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