ioctl函数

#include <sys/ioctl.h>

if (ioctl(fd, FBIOGET_FSCREENINFO, &Fix) < 0 || ioctl(fd, FBIOGET_VSCREENINFO, &Var) < 0) {}

定义:

ioctl是设备驱动程序中对设备IO通道进行管理的函数;所谓对IO通道进行管理就是对设备的一些特性进行控制、设置;

例如串口的传输波特率、马达的转速等。


int ioctl(int fd, int cmd, …);
fd是用户程序打开设备时使用open函数返回的文件标示符,
cmd是用户程序对设备的控制命令,
至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支
持,用户就能在用户程序中使用ioctl函数控制设备的I/O通道。

实现操作:

用户程式的ioctl是怎么和驱动程式中的ioctl实现联系在一起的?只要把write换成ioctl就会明白。

在驱动程式中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对
应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程式员自己的事
情,因为设备都是特定的。关键在于怎么样组织命令码,因为在ioctl中命令码是唯一联
系用户程式命令和驱动程式支持的途径。命令码的组织是有一些讲究的,因为我们一定
要做到命令和设备是一一对应的,这样才不会将正确的命令发给错误的设备,或是把错
误的命令发给正确的设备,或是把错误的命令发给错误的设备。这些错误都会导致不可
预料的事情发生,而当程式员发现了这些奇怪的事情的时候,再来调试程式查找错误,
那将是非常困难的事情。
所以在Linux核心中是这样定义一个命令码的
| 设备类型 | 序列号 | 方向 |数据尺寸|
|----------|--------|------|--------|
| 8 bit | 8 bit |2 bit |8~14 bit|
|----------|--------|------|--------|
这样一来,一个命令就变成了一个整数形式的命令码。不过命令码非常的不直观,所以
Linux Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或是从命
令码得到一些用户能理解的字符串以标明这个命令对应的设备类型、设备序列号、数
据传送方向和数据传输尺寸。
cmd参数怎么得出:

cmd参数在用户程式端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,

这个整数通过系统调用传递到内核中的驱动程式,再由驱动程式使用解码宏从这个整

数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switch{case}

结构进行相应的操作。要透彻理解,只能是通过阅读原始码,我这篇文章实际上只是

个引子。Cmd参数的组织还是比较复杂的,我认为要搞熟他还是得花不少时间的,不

过这是值得的,驱动程式中最难的是对中断的理解。

重点:

ioctl其实没有什么非常难的东西需要理解,关键是理解cmd命令码是怎么在用户程式里
生成并在驱动程式里解析的,程式员最主要的工作量在switch{case}结构中,因为对设
备的I/O控制都是通过这一部分的代码实现的。
参考下面文章:
http://wenku.baidu.com/view/febbceec5ef7ba0d4a733b2e.html

《write的奥秘》
http://wenku.baidu.com/view/be0a874a2e3f5727a5e96247.html



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值