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