?? plx9054.c
字號:
/*
PLX9054_Local_Reg_Read
讀取PLX9054 本地寄存器的值
input
int unit: PLX9054設備索引
int offset: PLX9054內部寄存器的偏移地址
output
UINT32 * pData: 讀取寄存器返回值的指針
*/
STATUS PLX9054_Local_Reg_Read( int index, int offset, UINT32 * pData)
{
#if 0
PLX9054_DRVCTRL * pDrvCtrl;
PLX9054_DEVICE * pDevCtrl;
#endif
#ifdef PLX_DEBUG
return OK;
#endif
return(PLX9054_ReadDword(index, P9054_ADDR_REG, (UINT32)offset, pData));
#if 0
pDrvCtrl = PLX9054_GetDrvCtrl();
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (offset < 0) || (offset > 0xff))
{
printf(" Register Offset Out of Range!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
pDevCtrl = pDrvCtrl->pDevice[index];
*pData = *(UINT32 *)(pDevCtrl->PlxPciRsrc.membaseCsr + (UINT32)offset);
return OK;
#endif
}
/*
PLX9054_Local_Reg_Write
寫PLX9054 本地寄存器的值
input
int unit: PLX9054設備索引
int offset: PLX9054內部寄存器的偏移地址
UINT32 data: 寫入的 數據
*/
STATUS PLX9054_Local_Reg_Write( int index, int offset, UINT32 data)
{
#if 0
PLX9054_DRVCTRL * pDrvCtrl;
PLX9054_DEVICE * pDevCtrl;
#endif
#ifdef PLX_DEBUG
return OK;
#endif
return(PLX9054_WriteDword(index, P9054_ADDR_REG, (UINT32)offset, data));
#if 0
pDrvCtrl = PLX9054_GetDrvCtrl();
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (offset < 0) || (offset > 0xff))
{
printf(" Register Offset Out of Range!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
pDevCtrl = pDrvCtrl->pDevice[index];
*(UINT32 *)(pDevCtrl->PlxPciRsrc.membaseCsr + (UINT32)offset) = data;
return OK;
#endif
}
/*
PLX9054_Pci_Reg_Read
讀取PLX9054 PCI配置寄存器的值
input
int unit: PLX9054設備索引
int offset: PLX9054 PCI 配置空間的偏移地址
output
UINT32 * pData: 讀取寄存器返回值的指針
*/
STATUS PLX9054_Pci_Reg_Read( int index, int offset, UINT32 * pData, DATA_WIDTH_MODE dataWidth)
{
PLX9054_DRVCTRL * pDrvCtrl;
PLX9054_DEVICE * pDevCtrl;
UINT8 byteData;
UINT16 wordData;
UINT32 dwordData;
int offset1;
#ifdef PLX_DEBUG
return OK;
#endif
pDrvCtrl = PLX9054_GetDrvCtrl();
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (offset < 0) || (offset > 0x50))
{
printf(" Register Offset Out of Range!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
pDevCtrl = pPlxDrvCtrl->pDevice[index];
switch(dataWidth)
{
case DATA_BYTE:
pciConfigInByte(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, &byteData);
*pData = (UINT32)byteData;
break;
case DATA_WORD:
pciConfigInWord(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, &wordData);
*pData = (UINT32)wordData;
break;
case DATA_DWORD:
pciConfigInLong(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, &dwordData);
*pData = (UINT32)dwordData;
break;
case DATA_TRI:
offset1 = offset % 4;
offset = offset - offset1;
pciConfigInLong(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, &dwordData);
dwordData = (dwordData >> (offset1 * 8)) && 0xffffff;
break;
default:
printf("Data Width Error!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
break;
}
return OK;
}
/*
PLX9054_Pci_Reg_Write
寫PLX9054 PCI配置寄存器的值
input
int unit: PLX9054設備索引
int offset: PLX9054 PCI 配置空間的偏移地址
output
UINT32 data: 寫入的 數據
*/
STATUS PLX9054_Pci_Reg_Write( int index, int offset, UINT32 data, DATA_WIDTH_MODE dataWidth)
{
PLX9054_DRVCTRL * pDrvCtrl;
PLX9054_DEVICE * pDevCtrl;
#ifdef PLX_DEBUG
return OK;
#endif
pDrvCtrl = PLX9054_GetDrvCtrl();
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (offset < 0) || (offset > 0x50))
{
printf(" Register Offset Out of Range!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
pDevCtrl = pPlxDrvCtrl->pDevice[index];
pciConfigOutLong (pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, data);
switch(dataWidth)
{
case DATA_BYTE:
pciConfigOutByte(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, (UINT8)data);
break;
case DATA_WORD:
pciConfigOutWord(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, (UINT16)data);
break;
case DATA_DWORD:
pciConfigOutLong(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, data);
break;
case DATA_TRI: /* 無需支持*/
/*
offset1 = offset % 4
offset = offset - offset1;
data = data << (offset1 * 8);
pciConfigOutLong(pDevCtrl->PlxPciRsrc.pciBus, pDevCtrl->PlxPciRsrc.pciDevice,
pDevCtrl->PlxPciRsrc.pciFunc, offset, data);
*/
break;
default:
printf("Data Width Error!file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
break;
}
return OK;
}
/*
PLX9054_ReadByte
讀取本地空間上的1字節數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
outpur
pData
*/
STATUS PLX9054_ReadByte (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, char * pData)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = pPlxDrvCtrl;
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
{
printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
{
printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
{
dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
*pData = *(char *)dwAddr;
return OK;
}
else
{/* 暫不支持I/O空間*/
return ERROR;
}
}
/*
PLX9054_WriteByte
向本地空間寫1字節數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
data: 數據
*/
STATUS PLX9054_WriteByte (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, char data)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = pPlxDrvCtrl;
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
{
printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
{
printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
{
dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
*(char *)dwAddr = data;
return OK;
}
else
{/* 暫不支持I/O空間*/
return ERROR;
}
}
/*
PLX9054_ReadWord
讀取本地空間上的1個字數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
outpur
pData
*/
STATUS PLX9054_ReadWord (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, short * pData)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = pPlxDrvCtrl;
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
{
printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
{
printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
{
dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
*pData = *(short *)dwAddr;
return OK;
}
else
{/* 暫不支持I/O空間*/
return ERROR;
}
}
/*
PLX9054_WriteWord
向本地空間寫1個字數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
data: 數據
*/
STATUS PLX9054_WriteWord (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, short data)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = pPlxDrvCtrl;
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
{
printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
{
printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
{
dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
*(short *)dwAddr = data;
return OK;
}
else
{/* 暫不支持I/O空間*/
return ERROR;
}
}
/*
PLX9054_ReadDword
讀取本地空間上的1個雙字的數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
outpur
pData
*/
STATUS PLX9054_ReadDword (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, UINT32 * pData)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = PLX9054_GetDrvCtrl( );
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if( (spaceIndex < P9054_ADDR_REG) || (spaceIndex >= P9054_ADDR_EPROM))
{
printf("SpaceIndex out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if(dwOffset >= pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwRange)
{
printf("Offset out of range file:%s, line:%d.\n", __FILE__, __LINE__);
return ERROR;
}
if (pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].fIsMemory)
{
dwAddr = pDrvCtrl->pDevice[index]->spaceDesc[spaceIndex].dwPciBar + dwOffset;
*(UINT32 *)pData = *(UINT32 *)(dwAddr);
return OK;
}
else
{/* 暫不支持I/O空間*/
return ERROR;
}
}
/*
PLX9054_WriteDword
向本地空間寫1個雙字的數據(包括本地寄存器)
intput:
index: 設備索引
spaceIndex: 設備內空間索引
dwOffset: 偏移地址
data: 數據
*/
STATUS PLX9054_WriteDword (int index, PLX9054_SPACE_INDEX spaceIndex, UINT32 dwOffset, UINT32 data)
{
PLX9054_DRVCTRL * pDrvCtrl;
UINT32 dwAddr;
pDrvCtrl = pPlxDrvCtrl;
/* 輸入參數判斷*/
if( (index < 0) || (index > (pDrvCtrl->plxCardNum - 1)))
{
printf("Index out of range file:%s, line:%d.\n", __FILE__, __LINE__);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -