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

标签 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() ?

对了,我用的板子是研华PCM-3342

最佳答案

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

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

关于在嵌入式设备中使用 ioperm() 与端口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024950/

相关文章:

python - 如何让子进程运行 60 秒

属性的 Python 映射函数

c - 从 GtkListStore 检索数据

c - 如何找到指向字符串的指针数组的新大小

linux - while循环bash中的if语句

linux - SSH 拦截 - Linux

c - 如何使用 C 语言在整个程序中仅使用一个变量接受 5 个数字并打印总和?

java - 在 CXF 拦截器中保存出站消息

c - 多个线程接收一个信号

c - 枚举数组中所有连续值的三元组