使用的是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;
}