1

下面的代码有问题。我需要它来访问端口 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

4

1 回答 1

0

好吧,我想这是那些简单地消失的问题之一。我相信我纠正了一个我确信与这个问题无关的小错误。但是当我这样做时,问题就消失了。

我会更好地描述我是如何解决它的,但我真的不知道我是怎么做到的。

于 2012-06-17T22:47:44.137 回答