ioctl函数_Linux字符设备驱动之实现ioctl文件操作

在前面的文章里面已经写了如何实现read、write操作,但是对于有些驱动仅仅靠read和write是不够的,比如对于一个led驱动,我们用户想控制led进行全亮、全灭、流水灯等等操作,那么显然使用ioctl给驱动发送不同的命令来实现不同的操作更加合适。

ioctl在file_operations里面的函数指针原型:

bcb62a74238a7f4da5c1b2ce761ff9d7.png

ioctl函数的第二个参数就是命令,ioctl命令的本质是一个32位数:设备类型8bit + 序列号8bit + 方向2bit + 数据尺寸8~14bit

通常使用下面四个宏来快速声明ioctl命令:

092c031a32fc897c448df4fb6a6af733.png

_IO: 可以定义一个没有方向的ioctl命令

_IOR: 可以定义一个方向是从驱动读的ioctl命令

_IOW: 可以定义一个方向是往驱动写的ioctl命令

_IOWR:可以定义一个双向的读写驱动的ioctl命令

定义的ioctl命令带有读写方向的好处是在驱动实现的ioctl中,可以根据命令的读写方法来判断调用copy_to_user还是copy_from_user操作内核资源,比如对于一个串口驱动,用户想获取当前串口的波特率,那么就可以使用_IOR宏定义一个命令来读取波特率。

type参数我们称之为幻数,通常定义一个宏来表示type,这个参数是自定义的,用来表示这个ioctl命令是用来控制哪个设备的以防命令的混淆,通常不同的幻数对应不同的设备;nr参数称之为序数,用来区分同一个设备的不同控制命令。实际使用时ioctl命令单独使用一个头文件:

7a6088963e044a892a598fb298a3e820.png

ioctl驱动实现

6f283c6ec84c61ca37c616c1dd1f32f0.png

app测试

4457668a33dedb5aa20e3b5780ef7ac9.png

以上是老韩的总结,喜欢就点个关注哦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值