gyict 2024-04-11 16:13 采纳率: 0%
浏览 20
已结题

PLX_SDK升级问题

使用的是PCI9052芯片,驱动用的公版4.4的,用的是VC++6.0,现在要升级到新的7.2版或更高的,我的代码要怎么改?
我不需要用AI生成的答案,我已经用过AI了。有实际这方开发经验的可联系我,价格可谈。

HANDLE ghIOC = NULL;
char    *gpVirAddr = NULL;
U64    gulIoBase = 0;
DWORD lBytesReturned;

/**********************************************
 *          Portability Macros
 *********************************************/
#define IoMessage(hdl, cmd, pBuff) \
        DeviceIoControl(       \
            (hdl),             \
            (cmd),             \
            (pBuff),           \
            sizeof(IOCTLDATA), \
            (pBuff),           \
            sizeof(IOCTLDATA), \
            &lBytesReturned,    \
            NULL               \
            )

int IoMapInp(unsigned short unIoPort)
{
    IOCTLDATA aIoBuf;

    if (ghIOC != NULL) {

        aIoBuf.u.BusIopData.Address    = (U64 ) gulIoBase + unIoPort;
        aIoBuf.u.BusIopData.AccessType = BitSize8;
        IoMessage(ghIOC, PLX_IOCTL_IO_PORT_READ, &aIoBuf);
    }
    return (int )(unsigned char ) aIoBuf.u.BusIopData.Buffer;
}

//-----------------------------------------------------------------------------
unsigned short IoMapInpw(unsigned short unIoPort)
{
    IOCTLDATA aIoBuf;

    if (ghIOC != NULL) {

        aIoBuf.u.BusIopData.Address    = (U64 ) gulIoBase + unIoPort;
        aIoBuf.u.BusIopData.AccessType = BitSize16;
        IoMessage(ghIOC, PLX_IOCTL_IO_PORT_READ, &aIoBuf);
    }
    return (unsigned short ) aIoBuf.u.BusIopData.Buffer;
}
//-----------------------------------------------------------------------------
int IoMapOutp(unsigned short unIoPort, int iVal)
{
    IOCTLDATA aIoBuf;

    if (ghIOC != NULL) {
        aIoBuf.u.BusIopData.Address    = (U64 ) gulIoBase + unIoPort;
        aIoBuf.u.BusIopData.AccessType = BitSize8;
        aIoBuf.u.BusIopData.Buffer = (U8 ) iVal;
        IoMessage(ghIOC, PLX_IOCTL_IO_PORT_WRITE, &aIoBuf);
    }
    return aIoBuf.ReturnCode;
}

//-----------------------------------------------------------------------------
unsigned short IoMapOutpw(unsigned short unIoPort, unsigned short unVal)
{
    IOCTLDATA aIoBuf;

    if (ghIOC != NULL) {
        aIoBuf.u.BusIopData.Address    = (U64 ) gulIoBase + unIoPort;
        aIoBuf.u.BusIopData.AccessType = BitSize16;
        aIoBuf.u.BusIopData.Buffer = (U16 ) unVal;
        IoMessage(ghIOC, PLX_IOCTL_IO_PORT_WRITE, &aIoBuf);
    }
    return aIoBuf.ReturnCode;
}

#define DRIVER_PATH "\\\\.\\"
HANDLE Hard::OpenPlxIOC()
{
    if (ghIOC == NULL) {
        char *sDriverName = DRIVER_PATH "pci9050-0";

        ghIOC = CreateFile(sDriverName,        // Open the device
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            NULL);
        if (ghIOC == INVALID_HANDLE_VALUE)
            ghIOC = NULL;
        else if (ghIOC != NULL) {
            const U16 IO_BASE_OFFSET = 0x300;
            const U8 PCI_BAR3_OFFSET = 0x1c;
            const U8 PCI_BAR2_NO = 0x2;
            IOCTLDATA aIoBuf;

            IoMessage(ghIOC, PLX_IOCTL_DEVICE_INIT, &aIoBuf);
            aIoBuf.u.MgmtData.offset = PCI_BAR3_OFFSET;
            IoMessage(ghIOC, PLX_IOCTL_PCI_REGISTER_READ, &aIoBuf);
            if (aIoBuf.ReturnCode == ApiSuccess)
                gulIoBase = (U32) (aIoBuf.u.MgmtData.value - 1) - IO_BASE_OFFSET;
            aIoBuf.u.MgmtData.offset = PCI_BAR2_NO;
            IoMessage(ghIOC, PLX_IOCTL_PCI_BAR_MAP, &aIoBuf);
            if (aIoBuf.ReturnCode == ApiSuccess)
                gpVirAddr = (char *) aIoBuf.u.MgmtData.value;
        }
    }
    return ghIOC;
}
  • 写回答

26条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-04-11 16:28
    关注
    获得3.00元问题酬金

    将 PLX_SDK 从 4.4 升级到 7.2 或更高版本的步骤:

    1. 更新头文件和库文件

    • 下载并安装 PLX_SDK 7.2 或更高版本。
    • 将新的头文件和库文件复制到你的项目中。

    2. 更新编译器选项

    • 确保你的编译器选项与新的 SDK 版本兼容。
    • 例如,对于 Visual C++ 6.0,你需要将编译器选项中的 "Platform SDK" 设置为 "Windows SDK Version 7.1" 或更高版本。

    3. 更新代码

    • IoMapInp() 和 IoMapInpw() 函数:
      • 这些函数已弃用,请使用 PlxPciRead8()PlxPciRead16() 代替。
    • IoMapOutp() 和 IoMapOutpw() 函数:
      • 这些函数已弃用,请使用 PlxPciWrite8()PlxPciWrite16() 代替。
    • DRIVER_PATH 常量:
      • 已弃用,请使用 PLX_PCI9050_DEVICE_NAME 常量。
    • OpenPlxIOC() 函数:
      • 已弃用,请使用 PlxPciOpenDevice() 函数。

    更新后的代码示例:

    #include <plx_sdk/plx_sdk.h>
    
    HANDLE ghIOC = NULL;
    char* gpVirAddr = NULL;
    U64 gulIoBase = 0;
    DWORD lBytesReturned;
    
    int IoMapInp(unsigned short unIoPort)
    {
        U8 value;
        PlxPciRead8(ghIOC, gulIoBase + unIoPort, &value);
        return (int)value;
    }
    
    unsigned short IoMapInpw(unsigned short unIoPort)
    {
        U16 value;
        PlxPciRead16(ghIOC, gulIoBase + unIoPort, &value);
        return value;
    }
    
    int IoMapOutp(unsigned short unIoPort, int iVal)
    {
        PlxPciWrite8(ghIOC, gulIoBase + unIoPort, (U8)iVal);
        return 0;
    }
    
    unsigned short IoMapOutpw(unsigned short unIoPort, unsigned short unVal)
    {
        PlxPciWrite16(ghIOC, gulIoBase + unIoPort, unVal);
        return 0;
    }
    
    #define DRIVER_PATH PLX_PCI9050_DEVICE_NAME
    
    HANDLE Hard::OpenPlxIOC()
    {
        if (ghIOC == NULL)
        {
            ghIOC = PlxPciOpenDevice(DRIVER_PATH);
            if (ghIOC != NULL)
            {
                const U16 IO_BASE_OFFSET = 0x300;
                const U8 PCI_BAR3_OFFSET = 0x1c;
                const U8 PCI_BAR2_NO = 0x2;
    
                U32 bar3Value;
                PlxPciRead32(ghIOC, PCI_BAR3_OFFSET, &bar3Value);
                gulIoBase = (bar3Value - 1) - IO_BASE_OFFSET;
    
                U32 bar2Value;
                PlxPciRead32(ghIOC, PCI_BAR2_NO, &bar2Value);
                gpVirAddr = (char*)bar2Value;
            }
        }
        return ghIOC;
    }
    

    其他注意事项:

    • 新的 SDK 版本可能包含其他更改和增强功能。请参阅 PLX_SDK 文档以了解详细信息。
    • 在升级之前,请备份你的项目代码。
    • 如果遇到任何问题,请参考 PLX_SDK 文档或联系 PLX 技术支持。
    评论

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 修改了问题 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line