以下代码存在问题。我需要它来访问端口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()?
顺便说一下,我使用的主板是advantech PCM-3342答案 0 :(得分:0)
嗯,我想这是一个简单消失的问题之一。我相信我纠正了一个我确信与这个问题无关的小虫子。但是当我这样做时,问题就消失了。
我会更好地描述我是如何解决它的,但我真的不知道我是怎么做到的。