ioctl方法

驱动程序除了需要提供读写设备能力之外,还需要提供控制设备的能力,这就需要用到ioctl方法。


1. ioctl方法
在应用层中,ioctl系统调用原型如下:

#include <sys/ioctl.h>

int ioctl(int fd, unsigned long cmd, ...);
fd:	文件描述符。
cmd:	控制命令。
第三个参数是可选的,具体由设备而定。

在内核层中,ioctl原型有两种(视内核版本而定);

2.6.36之前的内核是:

int (*ioctl) (struct inode *inode, struct file *file,  unsigned int cmd, unsigned long arg);

2.6.36之后的内核是:

long (*unlocked_ioctl) (struct file *file, unsigned int cmd, unsigned long arg);


2. ioctl命令
ioctl中的命令实际上就是一个整数,但是为了使命令具有可读性,或者更多的信息,这个命令分成了几个部分:

type:		类型/幻数,8bit长度,表示属于那个设备的命令。
number:		序号,8bit长度,命令的序列号,用来区分不同的命令。
direction:	传输方向,参数的传输方向,有_IO_NONE、_IO_READ和_IO_WRITE。
size:		参数长度。

Linux提供了宏来定义命令:

_IO(type,nr):		用于构造无参数的命令。
_IOR(type,nr,datatype)	用于构造读参数的命令。
_IOW(type,nr,datatype)	用于构造写参赛的命令。
_IOWR(type,nr,datatype)	双向数据传输的命令。

在构造命令之前呢最后先阅读Documentation/ioctl/ioctl-number.txt,这个文件里面说明了已经使用了的幻数和命令序号(目的是为了定义一个唯一的命令)。

例如:

#define EXT4_IOC_GETVERSION             _IOR('f', 3, long)
#define EXT4_IOC_SETVERSION             _IOW('f', 4, long)

#define EXT4_IOC_MIGRATE                _IO('f', 9)

3. ioctl方法的返回值
对于非法的命令ioctl方法通常返回是的-EINVAL。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值