Chinaunix首页 | 论坛 | 博客
  • 博客访问: 609362
  • 博文数量: 107
  • 博客积分: 713
  • 博客等级: 上士
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-05 00:14
个人简介

呵呵

文章分类

全部博文(107)

文章存档

2015年(2)

2014年(17)

2013年(29)

2012年(52)

2011年(7)

分类: LINUX

2012-10-26 15:17:28

在编写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) |
给主人留下些什么吧!~~