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

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

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

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

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

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

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

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

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

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

ioctl驱动实现

app测试

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

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

  1. 系统调用syscall函数和字符设备驱动file_operations

    一.syscall是什么 Linux 中分为用户态和内核态两种运行状态. 对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力.当进行一些敏感操作,比如说要打开文件(open)然后进行写入(wr ...

  2. char添加一个字符_LINUX字符设备驱动模型分析(起始篇)

    在前面几个模块的介绍中,我们主要以vfs为起始,完成了sysfs.设备-总线-驱动模型.platform设备驱动模型.i2c设备驱动模型.spi设备驱动模型的分析.在对这些模块进行分析的时候,我们或多 ...

  3. linux asm函数,Linux 字符设备驱动—— ioremap() 函数解析

    一. ioremap() 函数基础概念 几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同, ...

  4. linux64位ioremap函数,Linux 字符设备驱动—— ioremap() 函数解析

    一. ioremap() 函数基础概念 几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同, ...

  5. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  6. Linux 字符设备驱动的编写

    Linux 字符设备驱动的编写 作者:解琛 时间:2020 年 8 月 17 日 Linux 字符设备驱动的编写 一.Linux 设备分类 二.open() 三.数据结构 3.1 struct fil ...

  7. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

    目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...

  8. 字符设备驱动基础篇3——字符设备驱动工作原理

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html. 1.系统整体工作原理 (1)应用层-& ...

  9. linux驱动设备开发1——字符设备驱动

    0 LInux内核 linux内核的内部结构:内核各个模块如下所示 linux的驱动只有三种类型:字符设备驱动(键盘,鼠标).块设备驱动(硬盘).网络设备驱动(网卡,can等) 驱动的静态加载和动态加 ...

最新文章

  1. cmd装b专用代码_Python 用5行代码学机器学习—线性回归
  2. Linux的sysctl 命令参数详解
  3. sql注入——day01
  4. HDU 1115 Lifting the Stone(求多边形重心)
  5. 06链队列_LinkQueue--(栈与队列)
  6. 必看!建立内部邮件服务器注意要点
  7. Java常用工具类StringUtils的常用方法
  8. 浅谈最短路径的几个方法(Dijkstra,Bellman-Ford,SPFA,Floyd算法)
  9. 数据结构队列顺序循环队列、加入、删除、取头元素
  10. windows中用注册表删除guest账户
  11. 杨歌:金融电路与 Web3 经济模型原理
  12. l440加装固态硬盘ngff_联想L440笔记本电脑加装固态硬盘笔记
  13. 周超臣:支付宝的套路是我走过最长的路
  14. 基于JavaEE的游泳馆管理系统_JSP网站设计_SQLServer数据库设计
  15. 类似火车头的采集器-免费任意数据采集器
  16. STM32开发 -- RTC详解
  17. 【模拟集成电路】鉴频鉴相器设计(Phase Frequency Detector,PFD)
  18. vue搜索关键字标红
  19. 模电学习5. 耦合电容、去耦电容与旁路电容
  20. Measure()与onMeasure()

热门文章

  1. linux任务调度语法,linux crond任务调度-Go语言中文社区
  2. hpux oracle9,oracle 9i,10G,11G,各版本下载资源
  3. ubuntu20输入法qiehuan_Ubuntu20.04安装搜狗输入法
  4. Apache Flink 零基础入门(二十)Flink kafka connector
  5. CentOS6.7安装mysql5.7
  6. 为什么 Python 3 把 print 改为函数?
  7. DeepMind刚向星际争霸 II 的玩家们下了战书!你的对手可能是只AI,而你毫不知情...
  8. 06列表的常用基本操作
  9. android 星级评论,Android自定义RatingBar(星级评分控件)
  10. ubuntu系统静态路由