Linux设备驱动程序学习(4)

-高级字符驱动程序操作[(1)ioctl and llseek]

今天进入《Linux设备驱动程序(第3版)》第六章高级字符驱动程序操作的学习。

一、ioctl

大部分设备除了读写能力,还可进行超出简单的数据传输之外的操作,所以设备驱动也必须具备进行各种硬件控制操作的能力. 这些操作常常通过ioctl 方法来支持,它有和用户空间版本不同的原型:

需要注意的是:不管可选的参数arg是否由用户给定为一个整数或一个指针,它都以一个unsigned long 的形式传递。如果调用程序不传递arg参数, 被驱动收到的arg 值是未定义的。因为在arg参数上的类型检查被关闭了,所以若一个非法参数传递给ioctl,编译器是无法报警的,且任何关联的错误难以查找.

选择ioctl命令

为了防止向错误的设备使用正确的命令,命令号应该在系统范围内唯一。为方便程序员创建唯一的ioctl 命令代号,每个命令号被划分为多个位字段。要按Linux 内核的约定方法为驱动选择ioctl 的命令号, 应该首先看看include/asm/ioctl.h 和Documentation/ioctl-number.txt。要使用的位字段符号定义在:

type(幻数):8 位宽(_IOC_TYPEBITS),参考ioctl-number.txt选择一个数,并在整个驱动中使用它。

number(序数):顺序编号,8 位宽(_IOC_NRBITS)。

direction(数据传送的方向):可能的值是_IOC_NONE(没有数据传输)、_IOC_READ、_IOC_WRITE 和_IOC_READ|_IOC_WRITE (双向传输数据)。该字段是一个位掩码(两位), 因此可使用AND 操作来抽取_IOC_READ 和_IOC_WRITE。

size(数据的大小):宽度与体系结构有关,ARM为14位.可在宏_IOC_SIZEBITS 中找到特定体系的值.

中包含的定义了一些构造命令编号的宏:

linux设备驱动学习,linux设备驱动学习4相关推荐

  1. 如何学习linux设备驱动

    面对不断升级的内核,如何学习linux设备驱动   面对不断升级的linux内核.GNU开发工具.linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁 ...

  2. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  3. 嵌入式Linux驱动笔记(五)------学习platform设备驱动

    你好!这里是风筝的博客, 欢迎和我一起交流. 设备是设备,驱动是驱动. 如果把两个糅合写一起,当设备发生变化时,势必要改写整个文件,这是非常愚蠢的做法.如果把他们分开来,当设备发生变化时,只要改写设备 ...

  4. linux uart寄存器 代替 printk,Linux驱动学习之设备树(设备树下的LED驱动实验),...

    Linux驱动学习之设备树(设备树下的LED驱动实验), 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.相当于从驱动代码分离出来的配置文件,比如串口的波特率通过设 ...

  5. linux驱动开发学习2 设备树

    设备树 dtb板级信息文件,大势所趋,一定要学  如何确定要编译哪个DTS文件:查看linux下的arch/arm/boot/dts/Makefile  DTS语言有属于自己的语法:以树形来描述设备信 ...

  6. Linux驱动学习-平台设备驱动probe函数-20220410

    1.最简单的杂项设备 /* * @Descripttion: 最简单的杂项设备驱动 * @version: * @Author: topeet */ #include <linux/init.h ...

  7. linux驱动学习——字符设备号

    字符设备号本质就是一个32位的无符号整型值.高12位为主设备号:低20位为次设备号. 查看设备号 cat /proc/devices 4.1.构造设备号 源码路径: include/linux/kde ...

  8. linux块设备驱动编写,Linux内核学习笔记 -49 工程实践-编写块设备驱动的基础

    块设备可以随机存储.字符设备,比如键盘,只能按照输入顺序存取,不可随机,打乱输入的字节流. 文件系统层,包括常见的文件系统,以及虚拟文件系统层VFS,字符设备可以直接用应用程序打开.块设备不会在应用程 ...

  9. Linux驱动进阶学习--HDMI设备之edid相关开发

    一.引言 二.HDMI设备 ------> 1.edid ------> 2.edid修改的相关工具 ------------> 2.1.MonitorInfoView ------ ...

最新文章

  1. 引才125人!博士副处级待遇,硕士正科级,全部事业编​!限这些高校……
  2. CentOS 7.8升级gcc-8.2
  3. Advice for students of machine learning--转
  4. java excel data 导入数据_java实现导入导出excel数据
  5. ASP.NET自带的散列加密口令【转】
  6. 服务器端虚拟化安卓,安卓服务器端实例
  7. python matlibplot绘制矩阵_matplotlib.pyplot.matshow 矩阵可视化实例
  8. ACM-Maximum Tape Utilization Ratio
  9. AMD5470显卡Ubuntu下的U盘的使用
  10. 【每日一练 085】性能优化-实例优化(四)
  11. mysql数据库简单语句
  12. 52 - 算法 - LeetCode 20 数据结构类 stack
  13. Garden Planner中使用3D视图的技巧
  14. mt3dgis 视频教程
  15. ComputeShader
  16. python mysql就业情况_影响员工离职因素分析—Mysql/python
  17. 合同生效需要哪些要件
  18. linux学习笔记:06-ubuntu中挂载U盘
  19. 设计模式之装饰器(第一篇)
  20. 简述计算机无法开机时故障处理方法,主板出问题了怎么办?电脑主板常见问题与故障处理方法...

热门文章

  1. [原创]前端工作了一段时间经验总结,献给做前端的同学
  2. 【leetcode❤python】172. Factorial Trailing Zeroes
  3. guava之cache
  4. jwPlayer为js预留的回调方法
  5. UDP模式与TCP模式的区别
  6. 关于Outlook删除原邮箱邮件的解决办法
  7. Oracle高级SQL培训与讲解
  8. 解决问题:HTTP 错误 401.1 - 未授权:登录失败【转】
  9. windows server 触屏_宜昌触屏万能蒸烤箱价格-华春新能源有限公司
  10. 调用另一个cpp的变量_再谈条件变量—从入门到出家