在编写ioctl代码之前,首先需要定义命令,命令当然可以自己随便定义,但是这种情况可能会出现错误,比如对错误的设备使用正确的命令,所以命令号在系统范围内是唯一的很重要。
ioctl实现
如何实现ioctl方法?
1.定义命令
2.实现命令
定义命令
在编写ioctl代码之前,首先需要定义命令。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内是唯一的中定义。ioctl命令编码被划分为几个位段,include/asm/ioctl.h定义了这些位字段:类型(幻数),序号,传送方向,参数的大小。
Documentation/ioctl-number.txt文件中罗列了在内核中已经使用了的幻数。
定义命令
定义ioctl命令的正确方法是使用4 个位段,这个列表中介绍的符号定义在中:
Type
幻数(类型):表明哪个设备的命令,在参考了ioctl-number.txt之后选出,8位宽。
Number
序号,表明设备命令中的第几个,8位宽。
Direction
数据传送的方向,可能的值是_IOC_NONE(没有数据传输),_IOC_READ,_IOC_WRITE。数据传送是从应用程序的观点来看待的,_IOC_READ意思是从设备读。
size
用户数据的大小。(13/14位宽,视处理器而定)
内核提供了下列宏来帮助定义命令:
_IO(type,nr);
没有 参数的命令
_IOR(type,nr,datatype)
从驱动中读取数据
_IOW(type,nr,datatype)
写数据到驱动
_IOWR(type,nr,datatype)
双向传送,type和number成员作为参数被传递。
列子(example)
#define MEM_IOC_MAGIC 'm' //定义幻数
#define MEM_IOCSET _IOW(MEM_IOC_MAGIC,0,int)
#define MEM_IOCGQSET _IOR(MEM_IOC_MAGIC,1,int)
阅读(3445) | 评论(0) | 转发(0) |