您的位置:首页 > 其它

_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析

2016-04-22 12:42 411 查看
在Linux驱动程序里, ioctl() 函数上传送的 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。在Linux里面应用了很多宏来定义,我在这里只是翻译成简单易懂的,直接用数字代替宏。

这个30位的数字的位描述:



生成命令的宏7个:

#define _IO(type,nr)            (0<<30 | 0<<16 | type<<8 | nr<<0)
#define _IOW(type,nr,size)      (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOR(type,nr,size)      (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOWR(type,nr,size)     (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOW_BAD(type,nr,size)  (1<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOR_BAD(type,nr,size)  (2<<30 | sizeof(size)<<16 | type<<8 | nr<<0)
#define _IOWR_BAD(type,nr,size) (3<<30 | sizeof(size)<<16 | type<<8 | nr<<0)


解析命令宏4个:

#define _IOC_DIR(nr)        ( (nr>>30) & 0x3)
#define _IOC_TYPE(nr)       ( (nr>>8) & 0xFF)
#define _IOC_NR(nr)         ( (nr>>0) & 0xFF)
#define _IOC_SIZE(nr)       ( (nr>>16) & 0x3FFF)


特殊宏5个:

#define IOC_IN          0x40000000
#define IOC_OUT         0x80000000
#define IOC_INOUT       0xC0000000
#define IOCSIZE_MASK    0x3FFF0000
#define IOCSIZE_SHIFT   16


生成命令例1



解析过程和生成命令类似,只是一个反逻辑!这里就不多解释了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: