在ioctl.h头文件中定义了命令码
命令码用一个32位的整型数表达
bit29~31表示命令传输的方向,bit16~29记录要传输的数据的大小,bit8~15表示设备类型(一般用一个ASCII表示),bit0~7表示命令编号
其中数据大小可以和方向的bit29重叠
29位是特殊位,因为无方向定义值为1也就是无方向的时候会占用第29位,无方向就无所谓数据传输,所以携带数据大小段是0
有方向时候方向位不会占用29位所以数据大小占用29位是不影响的
#ifndef _SPARC_IOCTL_H
#define _SPARC_IOCTL_H
#define _IOC_NRBITS 8 //命令
#define _IOC_TYPEBITS 8 //设备类型
#define _IOC_SIZEBITS 13 /* Actually 14, see below. */ //数据大小
#define _IOC_DIRBITS 3 //方向
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) //命令掩码 0x000000FF
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) //设备类型掩码 0x000000FF
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) //数据大小掩码 0x00000FFF
#define _IOC_XSIZEMASK ((1 << (_IOC_SIZEBITS+1))-1) //数据大小掩码 0x00001FFF
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) //方向