专栏中心

EEPW首页 > 专栏 > linuxIOCTROL简介

linuxIOCTROL简介

发布人:yanqin 时间:2009-04-16 来源:工程师 发布文章
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数
%A
%A       如下:
%A
%A       int ioctl(int fd, ind cmd, …);
%A
%A       其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
%A
%A       ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
%A
%A       如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,
%A
%A       那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。
%A
%A       所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。
%A       在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情,因为设备都是特定的,这里也没法说。关键在于怎么样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径。
%A
%A       命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,这样才不会将正确的命令发给错误的设备,或者是把错误的命令发给正确的设备,或者是把错误的命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇怪的事情的时候,再来调试程序查找错误,那将是非常困难的事情。
%A
%A       所以在Linux核心中是这样定义一个命令码的:
%A
%A       ____________________________________
%A
%A       | 设备类型 | 序列号 | 方向 |数据尺寸|
%A
%A       |----------|--------|------|--------|
%A
%A       | 8 bit    |  8 bit |2 bit |8~14 bit|
%A
%A       |----------|--------|------|--------|
%A
%A
%A
%A       这样一来,一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观,所以Linux Kernel中提供了一些宏,这些宏可根据便于理解的字符串生成命令码,或者是从命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数据传送方向和数据传输尺寸。
%A
%A       
%A
%A       这些宏我就不在这里解释了,具体的形式请读者察看Linux核心源代码中的和,文件里给除了这些宏完整的定义。这里我只多说一个地方,那就是"幻数"。
%A
%A       幻数是一个字母,数据长度也是8,所以就用一个特定的字母来标明设备类型,这和用一个数字是一样的,只是更加利于记忆和理解。就是这样,再没有更复杂的了。
%A
%A       更多的说了也没有,读者还是看一看源代码吧,推荐各位阅读《Linux 设备驱动程序》所带源代码中的short一例,因为它比较短小,功能比较简单,可以看明白ioctl的功能和细节。
%A
%A       这里确实要说一说,cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、 数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switch{case}结构进行相应的操作。
%A
%A       要透彻理解,只能是通过阅读源代码,我这篇文章实际上只是一个引子。Cmd参数的组织还是比较复杂的,我认为要搞熟它还是得花不少时间的,但是这是值得的,驱动程序中最难的是对中断的理解。
%A
%A
%A
%A%A
%A

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

模拟电子技术 第二十一讲

视频 2010-01-20

AI 的能源消耗急剧上升,导致美国各家庭的电费飙升

《嵌入式Linux开发趋势》PDF课件下载

三星据报道在超大面板上推动 SoP 封装,挑战台积电和英特尔

跨域与多通道信号分析在嵌入式RF测试中的应用

华为推出 UCM 算法以减少对 HBM 的依赖,据报道将在 9 月开源

模拟电子技术 第二十二讲

视频 2010-01-20

英特尔可变显存技术让32GB内存笔记本流畅运行Qwen 30B参数大模型

工业充电器拓扑结构选型基础知识:升压PFC拓扑

[求助]

hs23 2004-08-18

模拟电子技术 第十九讲

视频 2010-01-20

《嵌入式Linux开发趋势》视频

《嵌入式Linux开发要点》视频下载

CONNECT TECH:先进的GMSL连接,赋能工业自动化

《嵌入式Linux的移植》PDF课件下载

1200V全垂直硅基氮化镓MOSFET

模拟电子技术 第十八讲

视频 2010-01-20

《嵌入式Linux开发要点》PDF课件下载

艾迈斯欧司朗LED技术驱动投影仪和抬头显示器高效照明革新

模拟电子技术 第二十讲

视频 2010-01-20

Vishay推出适用于恶劣环境的微型密封工业级多匝SMD金属陶瓷微调电位器

更多 培训课堂
更多 焦点
更多 视频

技术专区