_IO(), _IOR(), _IOW(), _IOWR() 宏的用法与解析
在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
