Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6080733
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-04-14 11:49:38

 

#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)

生成对应的字段的数值和掩码

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