📄 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 + -