下面的代码有问题。我需要它来访问端口 0x300 到 0x307,所以我这样做:
#ifdef LINUX
if(ioperm(PORT1,9,1)==-1) printf("Error in ioperm()");
#endif
其中 PORT1=0x300。
然后我这样做:
int j5inp(unsigned int addr){
#ifdef DOS
return inp(addr);
#endif
#ifdef LINUX
return inb(addr);
#endif
}
void j5outp(unsigned int addr, unsigned int val){
#ifdef DOS
outp(addr,val);
#endif
#ifdef LINUX
outb(val,addr);
#endif
}
/************/
hrd_check()
{
j5outp(PCHECK,0xAA);
if (j5inp(PCHECK)!=0xAA) return(0);
j5outp(PCHECK,0x55);
if (j5inp(PCHECK)!=0x55) return(0);
return(1);
}
其中 PCHECK=0x307。
我对此进行了测试,发现在发送后我可以从端口检索值 0xAA,但是第二个(0x55)失败,因为 inb() 仍然返回 0xAA。
我做错什么了吗?这可能是硬件问题吗?我应该尝试为每次调用 inb() 调用 ioperm() 函数还是应该尝试使用 iopl() ?
顺便说一下,我使用的主板是研华 PCM-3342