本文主要是介绍嵌入式 ioctl函数的实际意义小论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
函数名: ioctl
头文件:#include
功 能: 控制I/O设备,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用read /write 读写的,称为Out-of-band数据。也就是说,read / write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据。
用 法: int ioctl(int handle, int cmd,[int *argdx, int argcx]);
返回值:成功为0,出错为-1
usr/include/asm-generic/ioctl.h中定义的宏的注释:
#define _IOC_NRBITS 8 //序数(number)字段的 字位 宽度,8bits
#define _IOC_TYPEBITS 8 //幻数(type)字段的 字位 宽度,8bits
#define _IOC_SIZEBITS 14 //大小(size)字段的 字位 宽度,14bits
#define _IOC_DIRBITS 2 //方向(direction)字段的 字位 宽度,2bits
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)//序数字段的掩码,0x000000FF
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)//幻数字段的掩码,0x000000FF
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)//大小字段的掩码,0x00003FFF
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)//方向字段的掩码,0x00000003
#define _IOC_NRSHIFT 0 //序数字段在整个字段中的位移,0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) //幻数字段的位移,8
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)//大小字段的位移,16
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)//方向字段的位移,30
#define _IOC_NONE 0U //没有数据传输
#define _IOC_WRITE 1U //向设备写入数据,驱动程序必须从 用户空间 读入数据
#define _IOC_READ 2U //从设备中读取数据, 驱动程序 必须向 用户空间 写入数据
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
//构造无参数的命令编号
#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))
这篇关于嵌入式 ioctl函数的实际意义小论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!