Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139720
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 876
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-09 10:56
文章分类

全部博文(20)

文章存档

2013年(20)

我的朋友

分类: LINUX

2013-04-11 11:16:44

 

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

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

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