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

mashifei 2009-05-09 01:08:09
我在104工控板上调试一个开关量输入继电器,用sys/io.h的outb(write_addr)发命令可以正常控制,
但是在读inb(read_addr)时总是返回0xff。
我的操作系统是FC8。
请大侠指教一下!!!
...全文
1470 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyu_tiger 2011-02-25
  • 打赏
  • 举报
回复
楼主,你是怎么解决的? 我现在和你遇到的情况差不多。
ioperm在QT里面没有权限调用,我换成iopl(3),但是iopl(3)的值是-1.
我在root权限下用ioperm测试,读inb(read_addr)时总是返回0xff
zsjdream 2010-08-10
  • 打赏
  • 举报
回复
建议不要在应用层直接调用底层接口,最好通过驱动接口访问,因为这正是linux的特点所在
glacierful 2010-04-21
  • 打赏
  • 举报
回复
不懂,来学习的。
wangwang0504 2010-04-20
  • 打赏
  • 举报
回复
哎......................
litomboy 2009-07-10
  • 打赏
  • 举报
回复
来学习!
rzsheng 2009-06-26
  • 打赏
  • 举报
回复
高深,我来学习的
mashifei 2009-05-10
  • 打赏
  • 举报
回复
自己顶起,请高手继续关注
mashifei 2009-05-09
  • 打赏
  • 举报
回复
请高手们继续关注~~
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 morris88 的回复:]
io 地址冲突 ...
[/Quote]
有可能,我也这样想过,怎样能避免呢?
morris88 2009-05-09
  • 打赏
  • 举报
回复
io 地址冲突 ...
mashifei 2009-05-09
  • 打赏
  • 举报
回复
请大家继续关注哈~~
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 morris88 的回复:]
另外这个 iopl / ioperm 之类的操作必须是 x86 系列的 cpu 才行 ...


C/C++ codeiopl.c

该程序可以操作所有65536个端口。

该程序首先设置0x3FF端口的读写权限,然后读出原先的值,然后将原值的LSB翻转并写回端口,并在此读取端口值。

代码如下:

/*Godbach. Dec 18, 2008

Description:This function is used to test iopl()*/

#include <stdio.h>

#include <unistd.h>

#include <sys/io.h>



[/Quote]

谢啦,有点启发哈,我再琢磨琢磨。
solomon_大卫 2009-05-09
  • 打赏
  • 举报
回复
高深啊 qt高手可能linux端口和windows端口不一样啊
morris88 2009-05-09
  • 打赏
  • 举报
回复
另外这个 iopl / ioperm 之类的操作必须是 x86 系列的 cpu 才行 ...

iopl.c

该程序可以操作所有65536个端口。

该程序首先设置0x3FF端口的读写权限,然后读出原先的值,然后将原值的LSB翻转并写回端口,并在此读取端口值。

代码如下:

/*Godbach. Dec 18, 2008

Description: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;

}

程序执行结果:

[root@linux misc-progs]# ./a.out

Original value of port 0x3ff is : 01

Current value of port 0x3ff is : 00

[root@linux misc-progs]# ./a.out

Original value of port 0x3ff is : 00

Current value of port 0x3ff is : 01

该程序执行几次,将进行几次的LSB翻转。

注:这里再次使用0x3FF端口,主要个人对端口的理解还不很深入,其他高于0x3FF的端口进行测试的时候,没有得到既定的结果。这里权且还使用这个端口,借此对iopl的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 morris88 的回复:]
就是你以 root 登录系统,然后运行你的程序

你怎么确定的 outb 输出是正确的呢?它不会提供返回值的 ...
如果 outb 是正确的,那么 inb 也是正确的,那么貌似就只有两个
可能:
1、inb 地址不正确
2、硬件有问题
[/Quote]
对的,是root用户登录的。
对于outb输出的判断是我在io卡是已经连接好了外围设备(栏杆机),可以指定需要的端口进行正常控制。
1、inb 地址不正确 :我是按照供应商提供基地址进行设置的啊,并且在Windows下是可以的。
2、硬件有问题 : 同上windows下测试过的。
真是费解啊~~~ 快疯了。。。 不过还是谢谢你哈

morris88 2009-05-09
  • 打赏
  • 举报
回复
就是你以 root 登录系统,然后运行你的程序

你怎么确定的 outb 输出是正确的呢?它不会提供返回值的 ...
如果 outb 是正确的,那么 inb 也是正确的,那么貌似就只有两个
可能:
1、inb 地址不正确
2、硬件有问题
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 morris88 的回复:]
貌似 iopl 必须是 root 用户吧 ...
[/Quote]
root用户?怎么指定?为什么我outb的时候可以呢?
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 morris88 的回复:]
程序应该是对的,可以用 iopl 来提升权限
写端口 = 0x300, 读端口 = 0x301
你可以看看 iopl 的返回值是不是对的
另外你的 0x301 是不是本身就应该是 0xff(-1) ...
[/Quote]
iopl 的返回值是0,是对的啊
我的io卡是8个断的,如果是0xff 应该都是高电平
现在我是把其中的一个端口加了指定的电压(5v),不应该还是0xff啊
还有就是我随便指定一个基地址(someaddr)来读 inb(someaddr) 返回的都是0xff;
费解啊,我刚接触这方面的不是太懂,希望解惑啊! 谢谢!
morris88 2009-05-09
  • 打赏
  • 举报
回复
貌似 iopl 必须是 root 用户吧 ...
mashifei 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 morris88 的回复:]
你看看 /usr/include/sys/io.h 文件内容,inb 定义在其中,
或者贴上来,不同版本可能有差别...
[/Quote]
/usr/include/sys/io.h 文件中inb 的定义:
static __inline unsigned char
inb (unsigned short int port)
{
unsigned char _v;

__asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port));
return _v;
}
加载更多回复(8)

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧