使用嵌入式设备中的ioperm()与端口进行通信

时间:2012-06-13 23:44:51

标签: c linux io embedded port

以下代码存在问题。我需要它来访问端口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

1 个答案:

答案 0 :(得分:0)

嗯,我想这是一个简单消失的问题之一。我相信我纠正了一个我确信与这个问题无关的小虫子。但是当我这样做时,问题就消失了。

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