在用户空间,使用ioctl系统调用来控制设备,原型如下:
int ioctl(int fd, unsigned long cmd, ...)
第一个参数,文件描述符。
第二个参数:是否依赖于控制命令
驱动的ioctl的原型:
int (*ioctl)(struct inode *inode, struct file *flip, unsigned int cmd,unsigned long arg )
cmd 参数从用户的空间传下来
代码三部曲:
检测命令的有效性
检测参数的有效性
实现相应的命令
如何实现ioctl:
1、定义命令:为了防止对错误的设备使用正确的命令
include/asm/ioctl.h 中定义了四段:
类型(幻数):8位宽 对应哪个设备
序号: 表明设备命令中的第几个
数据传输方向:值可能为_IOC_NONE,_IOC_READ, _IOC_WRITE(从应用的角度看)
_IO(type, nr):没有参数命令
_IOR(type, nr, datatype):从驱动中读数据
2、实现命令
2.1 返回值
IOCTL函数的实现通常是根据命令执行一个switch语句。但是,当命令号不能匹配任何一个设备所支持的命令时,通常返回-EINVAL("非法参数“)
2.2 参数
如果是一个整数,可以直接使用,如果是指针,必须先进行检查,确保有效
不需要检查的:函数本身带有检查操作(copy_from_user)