7-1 Linux驱动之IOCTL

在用户空间,使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值