在ioctl.h头文件中定义了命令码
命令码用一个32位的整型数表达
bit29~31表示命令传输的方向,bit16~29记录要传输的数据的大小,bit8~15表示设备类型(一般用一个ascii表示),bit0~7表示命令编号
其中数据大小可以和方向的bit29重叠
#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) //方向掩码 0x00000003#define _ioc_nrshift 0#define _ioc_typeshift (_ioc_nrshift + _ioc_nrbits) //8#define _ioc_sizeshift (_ioc_typeshift + _ioc_typebits) //21#define _ioc_dirshift (_ioc_sizeshift + _ioc_sizebits) //29#define _ioc_none 1u //0x00000001无方向#define _ioc_read 2u //0x00000010读#define _ioc_write 4u //0x00000100写#define _ioc(dir,type,nr,size) \//命令宏 (((dir) << _ioc_dirshift) | \//方向 ((type) << _ioc_typeshift) | \//类型 ((nr) << _ioc_nrshift) | \//命令 ((size) _ioc_dirshift) & _ioc_dirmask) & (_ioc_write|_ioc_read)) != 0)? \ (((nr) >> _ioc_dirshift) & (_ioc_write|_ioc_read)): \ (((nr) >> _ioc_dirshift) & _ioc_dirmask) )#define _ioc_type(nr) (((nr) >> _ioc_typeshift) & _ioc_typemask)//获取类型#define _ioc_nr(nr) (((nr) >> _ioc_nrshift) & _ioc_nrmask)//获取命令#define _ioc_size(nr) \//获取数据大小 ((((((nr) >> _ioc_dirshift) & _ioc_dirmask) & (_ioc_write|_ioc_read)) == 0)? \ 0: (((nr) >> _ioc_sizeshift) & _ioc_xsizemask))/* ...and for the pcmcia and sound. */#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_xsizemask << _ioc_sizeshift)#define iocsize_shift (_ioc_sizeshift)#endif /* !(_sparc_ioctl_h) */
用法:
dir =_ioc_dir(nr) //根据命令获取传输方向type =_ioc_type(nr) //根据命令获取类型nr =_ioc_nr(nr) //根据命令获取类型命令size =_ioc_size(nr) //根据命令获取传输数据大小//////////////////////////////////////////////////////////////////////////////cmd=_ioc(dir,type,nr,size) //根据传输方向,类型,命令,传输数据大小构成命令码cmdcmd=_iow(type,nr,size) //根据类型,命令,传输数据类型生成读方向命令码cmd=_ior(type,nr,size) //根据类型,命令,传输数据类型生成写方向命令码cmd=_iowr(type,nr,size) //根据类型,命令,传输数据类型生成读写方向命令码cmd=_iow_bad(type,nr,size) //根据类型,命令,传输数据生成读方向命令码cmd=_ior_bad(type,nr,size) //根据类型,命令,传输数据生成写方向命令码cmd=_iowr_bad(type,nr,size) //根据类型,命令,传输数据生成读写方向命令码cmd=_io(type,nr) //根据类型,命令生成没数据传输的无方向的命令码
实例:
#define binder_write_read _iowr('b', 1, struct binder_write_read) //读写命令#define binder_set_idle_timeout _iow('b', 3, int64_t) //未实现#define binder_set_max_threads _iow('b', 5, size_t) //设置最大线程数#define binder_set_idle_priority_iow('b', 6, int) //未实现#define binder_set_context_mgr _iow('b', 7, int) //设置binder上下文管理者#define binder_thread_exit _iow('b', 8, int) //删除线程信息#define binder_version _iowr('b', 9, struct binder_version) //返回版本
利用超声波测距技术实现智能吸尘器的设计
数字管理才是企业2021的正确走向
MAXIM推出完全集成数字环境光传感器MAX9635
医疗废物在线监管系统医废多维度全程监控
大疆为彻底拿下植保市场 发动“价格战”
你知道linux命令码(_IO宏)?
AI智慧安防学校应用方案
Firefly-PX3-SE--动手教程
如何解决主要的 ALD 和 ALE 半导体工艺挑战
压力传感器、压力变送器与温度传感器、温度变送器
荣耀手环5篮球版评测 对于篮球和跑步爱好者来说确实不错
激光共聚焦显微镜能看到多少纳米?
T-2毒素快速检测仪的详细介绍
利用3D打印技术可对抗癌症?
简略地讲一下电机控制器
小米11参数曝光,有望在明年第一季度上市
手机信号的强弱和哪些因素有关系
MAX7030 基于晶振的分数N型收发器
当Oculus Rift领先时,Windows混合现实设备悄悄地增加了市场份额
泡泡玛特市值千亿背后,它成功的原因是什么