📄 plxdrv.c
字号:
//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 + -