头文件:
#include <sys/ioctl.h>
函数原型:
int ioctl(int fd, unsigned long request, ...);
描述:
是一个专用于设备输入输出操作的系统调用,
该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。
参数:
fd: 用户程序打开设备时使用
open
函数返回的文件标示符
cmd:
交互协议,设备驱动将根据
cmd
执行对应操作
…:补充参数,最多一个,
依赖
cmd
指定长度以及类型
返回值:
执行成功时返回 0
,失败则返回
-1
备注:
用户与驱动的 “
协议
”
参数
cmd
的格式为:
在内核中,提供了宏接口以生成上述格式的
ioctl
命令:
// include/uapi/asm-generic/ioctl.h
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
dir
(
direction
)
:
ioctl 命令访问模式(数据传输方向),占据
2 bit
,可以为
_IOC_NONE
、 _IOC_READ、
_IOC_WRITE
、
_IOC_READ | _IOC_WRITE
,分别指示了四种访问模式: 无数据、读数据、写数据、读写数据;
type
(
device type
)
:
设备类型,占据 8 bit
,在一些文献中翻译为
“
幻数
”
或者
“
魔数
”
,可以为任意
char型字符,例如:‘a’
、
’b’
、
’c’
等等,其主要作用是使
ioctl
命令有唯一的设备标识;
nr
(
number
)
:
命令编号/
序数,占据
8 bit
,可以为任意
unsigned char
型数据,取值范围
0~255
,如果定义了多个 ioctl
命令,通常从
0
开始编号递增;
size
:
涉及到 ioctl
函数 第三个参数
arg
,占据
13bit
或者
14bit
(体系相关,
arm
架构 一般为 14
位),指定了
arg
的数据类型及长度,如果在驱动的
ioctl
实现中不检查,通常可以忽略该参数;
通常而言,为了方便会使用宏 _IOC()
衍生的接口来直接定义
ioctl
命令:
/* used to create numbers */
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define
_IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define
_IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size)
_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
_IO : 定义不带参数的 ioctl 命令_IOW : 定义带写参数的 ioctl 命令( copy_from_user )_IOR : 定义带读参数的 ioctl 命令( copy_to_user )_IOWR : 定义带读写参数的 ioctl 命令