ioctl

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数

int ioctl(int fd, int cmd, …)

fd:用户程序打开设备时返回的文件标示符
cmd:用户程序对设备的控制命令

定义格式

| 设备类型| 序列号| 方向 |数据尺寸|
|---------|-------|------|--------|
|  8 bit  | 8 bit |2 bit |8~14 bit|
|---------|-------|------|--------|

宏头文件

asm/ioctl.h

宏注释

#define _IOC_SIZEBITS 14 //大小(size)字段的字位宽度,14bits
#define _IOC_NRBITS   8  //序数(number)字段的字位宽度,8bits
#define _IOC_TYPEBITS 8  //幻数(type)字段的字位宽度,8bits

#define _IOC_DIRSHIFT  (_IOC_SIZESHIFT+_IOC_SIZEBITS) //16+14
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) //0+8
#define _IOC_NRSHIFT   0 //0
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) //8+8

#define _IOC(dir, type, nr, size) 
(((dir) << _IOC_DIRSHIFT) | 
((type) << _IOC_TYPESHIFT) | 
((nr) << _IOC_NRSHIFT) | 
((size) << _IOC_SIZESHIFT))

#define _IOC_NONE 0U    //没有数据传输
#define _IOC_WRITE 1U   //向设备写入数据
#define _IOC_READ 2U    //从设备中读取数据

#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))

type(魔数): 魔数范围为 0~255 。通常,用英文字符 “A” ~ “Z” 或者 “a” ~ “z” 来表示。不同的设备驱动程序最好设置不同的魔数,但并不是要求绝对,也是可以使用其他设备驱动程序已用过的魔数
nr(序列号):通常,从 0开始递增,相同设备驱动程序上可以重复使用该值。例如,读取和写入命令中使用了相同的基数,设备驱动程序也能分辨出来
size(变量型):变量或者是变量的类型

cmd组成

_IOC(dir, type, nr, size)
_IO(type, nr)   //简单方法

举例

#define NEWCHAR_IOC_MAGIC   'M'
#define NEWCHAR_SET    _IO(NEWCHAR_IOC_MAGIC, 0)
#define NEWCHAR_GET    _IO(NEWCHAR_IOC_MAGIC, 1)
#define NEWCHAR_IOC_MAXNR   1
原文地址:https://www.cnblogs.com/zhangxuechao/p/11709819.html