当前位置: 代码迷 >> 驱动开发 >> 请问关于io端口读写有关问题(iopl,outb,inb)
  详细解决方案

请问关于io端口读写有关问题(iopl,outb,inb)

热度:79   发布时间:2016-04-28 10:48:46.0
请教关于io端口读写问题(iopl,outb,inb)
我在104工控板上调试一个开关量输入继电器,用sys/io.h的outb(write_addr)发命令可以正常控制,
但是在读inb(read_addr)时总是返回0xff。
我的操作系统是FC8。
请大侠指教一下!!!


------解决方案--------------------
就是你以 root 登录系统,然后运行你的程序

你怎么确定的 outb 输出是正确的呢?它不会提供返回值的 ...
如果 outb 是正确的,那么 inb 也是正确的,那么貌似就只有两个
可能:
1、inb 地址不正确
2、硬件有问题
------解决方案--------------------
另外这个 iopl / ioperm 之类的操作必须是 x86 系列的 cpu 才行 ...

C/C++ code
iopl.c该程序可以操作所有65536个端口。该程序首先设置0x3FF端口的读写权限,然后读出原先的值,然后将原值的LSB翻转并写回端口,并在此读取端口值。代码如下:/*Godbach. Dec 18, 2008Description:This function is used to test iopl()*/#include <stdio.h>#include <unistd.h> #include <sys/io.h>  #define PORT_ADDR 0x3FF int main(void){      int ret;      char port_val;       /*set r/w permission of all 65536 ports*/      ret = iopl(3);      if(ret < 0){           perror("iopl set error");           return 0;      }      port_val = inb(PORT_ADDR);      printf("Original value of port 0x%x is : %.2x\n", PORT_ADDR, port_val);            /*reverse the least significant bit */      outb(port_val^0x01, PORT_ADDR);      port_val = inb(PORT_ADDR);      printf("Current value of port 0x%x is : %.2x\n", PORT_ADDR, port_val);               /*set r/w permission of  all 65536 ports*/      ret = iopl(0);      if(ret < 0){           perror("iopl set error");           return 0;      }      return 0;}程序执行结果:[[email protected] misc-progs]# ./a.out Original value of port 0x3ff is : 01Current value of port 0x3ff is : 00[[email protected] misc-progs]# ./a.out Original value of port 0x3ff is : 00Current value of port 0x3ff is : 01该程序执行几次,将进行几次的LSB翻转。注:这里再次使用0x3FF端口,主要个人对端口的理解还不很深入,其他高于0x3FF的端口进行测试的时候,没有得到既定的结果。这里权且还使用这个端口,借此对iopl的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。