Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1248494
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2012-09-28 11:23:09


  usr/include/asm-generic/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 //从设备中读取数据,必须向用户空间写入数据
  #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)

阅读(966) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~