📄 p9050_lib.c
字号:
}
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 + -