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

📄 plx9054.c

📁 Vxworks 下PLX 9054 的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
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 + -