ioctl设备操作

目的:为了处理非数据的操作。

 

1、用户函数原型:int ioctl(int d,int request,.....);

d是操作文件描述符;request代表不同操作的数字值;.....是C语言的实参个数可变的函数原型声明形式,可是这里表示可有可无的参数。

第三个形参为unsigned long 类型,除了可以传递数值,还可以传递指针这样用户空间与内核空间就可以交互任意多个字节。

 

2、内核函数原型:long (*unlocked_ioctl)(struct file*,unsigned int ,unsigned long);

第一个参数表示打开的文件的file结构指针,第二个参数和系统调用的第二个参数request对用,第三个参数对应系统调用的第三个参数。

 

3、命令编码规则

31-30:含义

             00 —— 命令不带参数

             10——命令需要从驱动中获取数据,读方向

              01——命令需要把数据写入驱动,写方向

              11——命令既要写入数据又要获取数据,读写方向

29-16     如果命令带参数,则指定参数所占用的内存空间大小

15-8       每个驱动全局唯一的幻数(魔数)

7-0         命令码

 

4、定义命令编码的宏:

_IOC(dir,type,nr,size)

dir:    位31-30

type: 位15-8,区别命令码

nr:    位7-0命令码

size: 位29-16参数字节大小

 

5、提取命令编码信息宏

_IOC_DIR(命令编码)

_IOC_TYPE(命令编码)

_IOC_NR(命令编码)

_IOC_SIZE(命令编码)

 

6、驱动中实现ioctl函数

思想:在ioctl函数中加入switch(cmd){}选择分支,根据cmd的不同区分不同的命令。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值