在编写ioctl 代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命 令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对 FIFO 和 audio 等 这类非串行设备输入流修改波特率,如果每一个 ioctl 命令都是唯一的,应用程序进行这种操作时就 会得到一个 EINVAL 错误,而不是无意间成功地完成了意想不到的操作。

要 按 Linux 内核的约定方法为驱动程序选择 ioctl 编 号,应该首先看看 include/asm/ioctl.h (我在网上下载的是2.6.29内核,在asm下没用找到ioctl.h文件,相应的变换到了目录asm-generic下)和 Doucumention/ioctl-number.txt 这 两个文件。头文件定义了要使用的位字段:类型(幻数)、序数、传送方向以及参数大小等。 ioctl-number.txt 文 件中罗列了内核所使用的幻数,选择自己的幻数要避免和内核冲突。以下是对 include/asm/ioctl.h 中 定义的宏的注释:

#define          _IOC_NRBITS           8                   // 序数( number )字段的字位宽度, 8bits

#define          _IOC_TYPEBITS        8                     // 幻数( type )字段的字位宽度, 8bits

#define          _IOC_SIZEBITS         14                  // 大小( size )字段的字位宽度, 14bits

#define          _IOC_DIRBITS         2                    // 方向( direction )字段的字位宽 度, 2bits

#define          _IOC_NRMASK          ((1 << _IOC_NRBITS)-1)     // 序数字段的掩 码, 0x000000FF

#define          _IOC_TYPEMASK     ((1 << _IOC_TYPEBITS)-1)   // 幻数字段的掩 码, 0x000000FF

#define          _IOC_SIZEMASK       ((1 << _IOC_SIZEBITS)-1)    // 大小字段的掩 码, 0x00003FFF

#define          _IOC_DIRMASK        ((1 << _IOC_DIRBITS)-1)     // 方向字段的掩 码, 0x00000003

#define         _IOC_NRSHIFT         0                                                          // 序数字段在整个 字段中的位移, 0

#define         _IOC_TYPESHIFT     (_IOC_NRSHIFT+_IOC_NRBITS)          // 幻数字段的位 移, 8

#define         _IOC_SIZESHIFT      (_IOC_TYPESHIFT+_IOC_TYPEBITS)   // 大小字段的位 移, 16

#define         _IOC_DIRSHIFT        (_IOC_SIZESHIFT+_IOC_SIZEBITS)     // 方向字段的位 移, 30

/*

* Direction bits.

*/

#define  _IOC_NONE       0U      // 没有数据传输

#define  _IOC_WRITE     1U      // 向设备写入数 据,驱动程序必须从用户空间读入数据

#define  _IOC_READ       2U      // 从设备中读取数 据,驱动程序必须向用户空间写入数据

/*

*_IOC  宏将 dir , type , nr , size 四个参数组合成一个 cmd 参数,如下图:

*

*/

 500)this.width=500;" border=0>

#define  _IOC (dir ,type ,nr ,size ) /

(((dir )   << _IOC_DIRSHIFT) | /

((type ) << _IOC_TYPESHIFT) | /

((nr )    << _IOC_NRSHIFT) | /

((size ) << _IOC_SIZESHIFT))

/*

* used to create numbers

*/

// 构造无参数的命令编号

#define  _IO (type ,nr )              _IOC(_IOC_NONE,(type ),(nr ),0)

// 构造从驱动程序中读取数据的命令编号

#define  _IOR (type ,nr ,size )      _IOC(_IOC_READ,(type ),(nr ),sizeof(size ))

// 用 于向驱动程序写入数据命令

#define  _IOW (type ,nr ,size )     _IOC(_IOC_WRITE,(type ),(nr ),sizeof(size ))

// 用 于双向传输

#define  _IOWR (type ,nr ,size )  _IOC(_IOC_READ|_IOC_WRITE,(type ),(nr ),sizeof(size ))

/*

*used to decode ioctl numbers..

*/

// 从命令参数中解析出数据方向,即写进还是读出

#define  _IOC_DIR (nr )           (((nr ) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)

// 从命令参数中解析出幻数 type

#define  _IOC_TYPE (nr )               (((nr ) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)

// 从命令参数中解析出序数 number

#define  _IOC_NR (nr )            (((nr ) >> _IOC_NRSHIFT) & _IOC_NRMASK)

// 从命令参数中解析出用户数据大小

#define  _IOC_SIZE (nr )          (((nr ) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

/* ...and for the drivers/sound files... */

#define  IOC_IN              (_IOC_WRITE << _IOC_DIRSHIFT)

#define  IOC_OUT           (_IOC_READ << _IOC_DIRSHIFT)

#define  IOC_INOUT       ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)

#define  IOCSIZE_MASK        (_IOC_SIZEMASK << _IOC_SIZESHIFT)

#define  IOCSIZE_SHIFT        (_IOC_SIZESHIFT)

关于ioctl幻数构造相关推荐

  1. linux字符设备驱动的 ioctl 幻数

    在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...

  2. linux3.0字符设备驱动,linux字符设备驱动的 ioctl 幻数

    在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...

  3. 驱动程序实例(一):LED设备驱动程序( platform + cdev)

    结合之前对Linux内核的platform总线 ,以及对字符设备的cdev接口的分析,本文将编写基于platform总线与cdev接口的LED设备的实例代码并对其进行分析. platform总线分析, ...

  4. linux2.6驱动学习笔记之字符驱动

    1.字符驱动组成 1.1字符驱动的模块加载与卸载 //设备结构体模板 struct xxx_dev_t { struct cdev cdev; ...... }xxx_dev; 在字符驱动模块加载函数 ...

  5. 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解

    在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...

  6. 构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解

    在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...

  7. 新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解

    kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl : ioctl,unlocked_ioctl和compat_ioctl 现在只有unloc ...

  8. IOCTL命令-_IO, _IOR, _IOW, _IOWR 幻数的理解

    有一年半时间没有一行一行的写过linux驱动程序了,有的东西会发现遗忘了,今天就当是复习一下吧. 在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在 ...

  9. ioctl -构造命令编号 _IO,_IOW,_IOR,_IOWR

    原文地址:http://blog.chinaunix.net/uid-20754793-id-177774.html 今天在写字符驱动验证程序的时候要用到ioctl函数,其中有一个cmd参数,搞了半天 ...

最新文章

  1. [UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode
  2. php修改数据库字段内容,php对数据库的增删改查操作
  3. 刚学编程的程序员必备这5大编程网站,你知道几个?
  4. Intel VT学习笔记(七)—— EPT物理地址转换
  5. c++运算符重载中很多人易忘的小细节
  6. java jdbc数据库五种连接方式
  7. jenkins 自带环境变量
  8. 一本名不符实的.NET书籍: Game Engine Toolset Development
  9. docker搭建sonar服务
  10. 软考初级程序员主要考什么?如何复习?
  11. emu8086,汇编程序:屏幕输入字符串,设置寄存器的值
  12. 服务器如何设置内网IP地址
  13. 4 月 1 日罗永浩直播首秀带货小米 10,你会剁手吗?
  14. 数字和模拟混合供电20190221
  15. 线上事件处理流程规范
  16. 计算机卡慢解决方法,电脑很卡怎么办,详细教您电脑很卡很慢应该怎么解决
  17. 你了解设计公司的服务内容有哪些吗?
  18. 医院九阵系统服务器电源,九阵医院信息管理系统
  19. Revit二次开发-根据两个点创建剖面视图
  20. 【图结构】之图注意力网络GAT详解

热门文章

  1. 学习web第四周第五天
  2. python魔方方法超详细介绍
  3. 咋筛选变量进入多因素回归 纳入变量 变量选择 类似机器学习的特征选择 cox回归分析cox多因素
  4. 网游中针对网络延迟的优化
  5. SE-Networks
  6. apache 2.4 httpd 2.4.6 反向代理后端的服务为HTTPS https 基于centos7
  7. mac mongodb : 715: /data/db/WiredTiger.turtle: handle-open: open: Permission denied
  8. 小米笔记本重装系统后触摸板失灵 的原因之一
  9. OpenCV入门(3):图像的组成,色彩空间及通道的分离合并
  10. python入门指南by许半仙百度云-Python入门指南 作者:许半仙(4)